{
  "repository": "home-assistant/core",
  "ref": "6b9637c492f32551463d026426e10806e5316be0",
  "methods": [
    {
      "slug": "formal",
      "title": "Formal verification and model checking"
    },
    {
      "slug": "static_analysis",
      "title": "Static analysis"
    },
    {
      "slug": "testing",
      "title": "Testing"
    },
    {
      "slug": "formatting",
      "title": "Formatting and hygiene"
    },
    {
      "slug": "supply_chain",
      "title": "Supply chain"
    },
    {
      "slug": "unclassified",
      "title": "Unclassified"
    }
  ],
  "verifications": [
    {
      "tool": "codeql",
      "method": "static_analysis",
      "commands": [
        "uses github/codeql-action/analyze"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/codeql.yml",
          "locator": "jobs.analyze.steps[2] (Perform CodeQL Analysis)"
        }
      ],
      "upstream": "https://github.com/github/codeql",
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": "mypy",
      "method": "static_analysis",
      "commands": [
        "mypy --num-workers=4 homeassistant packages/pylint-home-assistant",
        "mypy --num-workers=4 $(printf homeassistant/components/%s  ${INTEGRATIONS_GLOB})"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.mypy.steps[5] (Run mypy (fully))"
        },
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.mypy.steps[6] (Run mypy (partially))"
        },
        {
          "path": "mypy.ini",
          "locator": "config file"
        }
      ],
      "upstream": "https://github.com/python/mypy",
      "docs": "https://mypy.readthedocs.io/en/stable/command_line.html",
      "exit_codes": {
        "0": "no type errors",
        "1": "type errors found",
        "2": "crash or invalid invocation"
      },
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": "pylint",
      "method": "static_analysis",
      "commands": [
        "pylint --jobs 0 --ignore-missing-annotations=y homeassistant",
        "pylint --ignore-missing-annotations=y $(printf homeassistant/components/%s  ${INTEGRATIONS_GLOB})",
        "pylint --jobs 0 tests packages/pytest-homeassistant/pytest_homeassistant",
        "pylint $(printf tests/components/%s  ${TESTS_GLOB})"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.pylint.steps[3] (Run pylint (fully))"
        },
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.pylint.steps[4] (Run pylint (partially))"
        },
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.pylint-tests.steps[3] (Run pylint (fully))"
        },
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.pylint-tests.steps[4] (Run pylint (partially))"
        },
        {
          "path": "pyproject.toml",
          "locator": "[tool.pylint]"
        }
      ],
      "upstream": "https://github.com/pylint-dev/pylint",
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": "ruff-check",
      "method": "static_analysis",
      "commands": [
        "pre-commit hook ruff-check"
      ],
      "triggers": [
        "pre_commit"
      ],
      "evidence": [
        {
          "path": ".pre-commit-config.yaml",
          "locator": "hooks.ruff-check"
        },
        {
          "path": "pyproject.toml",
          "locator": "[tool.ruff]"
        },
        {
          "path": "homeassistant/components/mvglive/ruff.toml",
          "locator": "config file"
        },
        {
          "path": "packages/hassfest/ruff.toml",
          "locator": "config file"
        },
        {
          "path": "packages/hassfest/tests/ruff.toml",
          "locator": "config file"
        },
        {
          "path": "packages/pylint-home-assistant/ruff.toml",
          "locator": "config file"
        },
        {
          "path": "packages/pytest-homeassistant/ruff.toml",
          "locator": "config file"
        },
        {
          "path": "script/ruff.toml",
          "locator": "config file"
        },
        {
          "path": "script/scaffold/templates/ruff.toml",
          "locator": "config file"
        },
        {
          "path": "script/sqlite3_vendor/ruff.toml",
          "locator": "config file"
        },
        {
          "path": "tests/ruff.toml",
          "locator": "config file"
        },
        {
          "path": "tests/testing_config/custom_components/ruff.toml",
          "locator": "config file"
        }
      ],
      "upstream": "https://github.com/astral-sh/ruff",
      "docs": "https://docs.astral.sh/ruff/linter/#exit-codes",
      "exit_codes": {
        "0": "no violations",
        "1": "violations found",
        "2": "invalid configuration, CLI options or internal error"
      },
      "autofix": true,
      "declared_only": false
    },
    {
      "tool": "zizmor",
      "method": "static_analysis",
      "commands": [
        "pre-commit hook zizmor"
      ],
      "triggers": [
        "pre_commit"
      ],
      "evidence": [
        {
          "path": ".pre-commit-config.yaml",
          "locator": "hooks.zizmor"
        }
      ],
      "upstream": "https://github.com/zizmorcore/zizmor",
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": "playwright",
      "method": "testing",
      "commands": [
        "playwright test"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/e2e-tests.yml",
          "locator": "jobs.boot_check.steps[5] (Run Playwright E2E tests)"
        },
        {
          "path": "tests/e2e/playwright.config.ts",
          "locator": "config file"
        }
      ],
      "upstream": "https://github.com/microsoft/playwright",
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": "pytest",
      "method": "testing",
      "commands": [
        "pytest -c packages/hassfest/pyproject.toml packages/hassfest/tests",
        "pytest -qq --timeout=9 --durations=0 --durations-min=1 --numprocesses logical --snapshot-details --dist=loadfile ${cov_params[@]} -o console_output_style=count -p no:sugar --exclude-warning-annotations $(sed -n ${TEST_GROUP},1p pytest_buckets.txt) 2>&1",
        "pytest -qq --timeout=20 --numprocesses logical --dist=loadfile --snapshot-details ${cov_params[@]} -o console_output_style=count --durations=0 --durations-min=10 -p no:sugar --exclude-warning-annotations --dburl=mysql://root:password@127.0.0.1/homeassistant-test ${RECORDER_TEST_DIRS} 2>&1",
        "pytest -qq --timeout=9 --numprocesses logical --dist=loadfile --snapshot-details ${cov_params[@]} -o console_output_style=count --durations=0 --durations-min=10 -p no:sugar --exclude-warning-annotations --dburl=postgresql://postgres:password@127.0.0.1/homeassistant-test ${RECORDER_TEST_DIRS} 2>&1",
        "pytest -qq --timeout=20 --numprocesses logical --dist=loadfile --snapshot-details -o console_output_style=count --durations=0 --durations-min=10 -p no:sugar -p tests.sqlite3_shim --exclude-warning-annotations ${RECORDER_TEST_DIRS} 2>&1"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.hassfest.steps[3] (Test hassfest package)"
        },
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.pytest-full.steps[6] (Run pytest)"
        },
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.pytest-mariadb.steps[6] (Run pytest (partially))"
        },
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.pytest-postgres.steps[8] (Run pytest (partially))"
        },
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.pytest-sqlite.steps[7] (Run pytest (partially))"
        },
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.pytest-partial.steps[6] (Run pytest)"
        },
        {
          "path": "pyproject.toml",
          "locator": "[tool.pytest]"
        },
        {
          "path": "packages/pytest-homeassistant/tests/standalone/pytest.ini",
          "locator": "config file"
        }
      ],
      "upstream": "https://github.com/pytest-dev/pytest",
      "docs": "https://docs.pytest.org/en/stable/reference/exit-codes.html",
      "exit_codes": {
        "0": "all tests passed",
        "1": "some tests failed",
        "2": "interrupted by the user",
        "3": "internal error",
        "4": "command line usage error",
        "5": "no tests were collected"
      },
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": "codespell",
      "method": "formatting",
      "commands": [
        "pre-commit hook codespell"
      ],
      "triggers": [
        "pre_commit"
      ],
      "evidence": [
        {
          "path": ".pre-commit-config.yaml",
          "locator": "hooks.codespell"
        }
      ],
      "upstream": "https://github.com/codespell-project/codespell",
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": "pre-commit-hooks",
      "method": "formatting",
      "commands": [
        "pre-commit hook check-executables-have-shebangs",
        "pre-commit hook check-json"
      ],
      "triggers": [
        "pre_commit"
      ],
      "evidence": [
        {
          "path": ".pre-commit-config.yaml",
          "locator": "hooks.check-executables-have-shebangs"
        },
        {
          "path": ".pre-commit-config.yaml",
          "locator": "hooks.check-json"
        }
      ],
      "upstream": "https://github.com/pre-commit/pre-commit-hooks",
      "docs": null,
      "exit_codes": {},
      "autofix": true,
      "declared_only": false
    },
    {
      "tool": "prettier",
      "method": "formatting",
      "commands": [
        "pre-commit hook prettier"
      ],
      "triggers": [
        "pre_commit"
      ],
      "evidence": [
        {
          "path": ".pre-commit-config.yaml",
          "locator": "hooks.prettier"
        },
        {
          "path": ".prettierrc.js",
          "locator": "config file"
        }
      ],
      "upstream": "https://github.com/prettier/prettier",
      "docs": "https://prettier.io/docs/cli#exit-codes",
      "exit_codes": {
        "0": "everything formatted",
        "1": "something was not formatted (--check)",
        "2": "prettier error"
      },
      "autofix": true,
      "declared_only": false
    },
    {
      "tool": "ruff-format",
      "method": "formatting",
      "commands": [
        "pre-commit hook ruff-format"
      ],
      "triggers": [
        "pre_commit"
      ],
      "evidence": [
        {
          "path": ".pre-commit-config.yaml",
          "locator": "hooks.ruff-format"
        }
      ],
      "upstream": "https://github.com/astral-sh/ruff",
      "docs": "https://docs.astral.sh/ruff/formatter/#exit-codes",
      "exit_codes": {
        "0": "already formatted",
        "1": "files would be reformatted (--check)",
        "2": "error"
      },
      "autofix": true,
      "declared_only": false
    },
    {
      "tool": "dependency-review",
      "method": "supply_chain",
      "commands": [
        "uses actions/dependency-review-action"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.dependency-review.steps[1] (Dependency review)"
        }
      ],
      "upstream": "https://github.com/actions/dependency-review-action",
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "bash ${RUNNER_TEMP}/gh-aw/actions/audit_pre_agent_workspace.sh"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/check-requirements.lock.yml",
          "locator": "jobs.agent.steps[25] (Audit pre-agent workspace)"
        },
        {
          "path": ".github/workflows/quality-scale-reviewer.lock.yml",
          "locator": "jobs.agent.steps[26] (Audit pre-agent workspace)"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "bash ${RUNNER_TEMP}/gh-aw/actions/check_oauth_tokens.sh"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/check-requirements.lock.yml",
          "locator": "jobs.activation.steps[6] (Check for OAuth tokens)"
        },
        {
          "path": ".github/workflows/quality-scale-reviewer.lock.yml",
          "locator": "jobs.activation.steps[6] (Check for OAuth tokens)"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "bash ${RUNNER_TEMP}/gh-aw/actions/check_otlp_default_credentials.sh"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/check-requirements.lock.yml",
          "locator": "jobs.agent.steps[3] (Check OTLP telemetry configuration)"
        },
        {
          "path": ".github/workflows/quality-scale-reviewer.lock.yml",
          "locator": "jobs.agent.steps[3] (Check OTLP telemetry configuration)"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "build packages/pytest-homeassistant --outdir dist"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/builder.yml",
          "locator": "jobs.build_python.steps[4] (Build package)"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "cosign verify --certificate-oidc-issuer https://token.actions.githubusercontent.com --certificate-identity-regexp https://github.com/home-assistant/core/.* ghcr.io/home-assistant/${arch}-homeassistant:${VERSION}"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/builder.yml",
          "locator": "jobs.publish_container.steps[3] (Verify architecture image signatures)"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "pre-commit hook no-commit-to-branch"
      ],
      "triggers": [
        "pre_commit"
      ],
      "evidence": [
        {
          "path": ".pre-commit-config.yaml",
          "locator": "hooks.no-commit-to-branch"
        }
      ],
      "upstream": "https://github.com/pre-commit/pre-commit-hooks",
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "pre-commit hook yamllint"
      ],
      "triggers": [
        "pre_commit"
      ],
      "evidence": [
        {
          "path": ".pre-commit-config.yaml",
          "locator": "hooks.yamllint"
        }
      ],
      "upstream": "https://github.com/adrienverge/yamllint.git",
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "requirements_test.txt"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.mypy.steps[1] (Generate partial mypy restore key)"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "requirements_test_pre_commit.txt zizmor --pedantic --collect=all --strict-collection --no-exit-codes --no-progress --format=sarif . > zizmor.sarif"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/zizmor.yml",
          "locator": "jobs.report.steps[2] (Generate accepted-code SARIF)"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "script.check_requirements --pr-number ${PR_NUMBER} --head-sha ${HEAD_SHA} --diff deterministic/pr.diff --output deterministic/results.json"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/check-requirements-deterministic.yml",
          "locator": "jobs.deterministic.steps[4] (Run deterministic checks)"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "script.licenses check licenses-${PYTHON_VERSION}.json"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.audit-licenses.steps[4] (Check licenses)"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "script.split_tests --cache pytest_test_counts.json ${TEST_GROUP_COUNT} tests"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.prepare-pytest-full.steps[4] (Run split_tests.py)"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "tee pytest-${PYTHON_VERSION}-${TEST_GROUP}.txt"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.pytest-full.steps[6] (Run pytest)"
        },
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.pytest-partial.steps[6] (Run pytest)"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "tee pytest-${PYTHON_VERSION}-${mariadb}.txt"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.pytest-mariadb.steps[6] (Run pytest (partially))"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "tee pytest-${PYTHON_VERSION}-${postgresql}.txt"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.pytest-postgres.steps[8] (Run pytest (partially))"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "tee pytest-${PYTHON_VERSION}-sqlite-${EXPECTED_SQLITE_VERSION}.txt"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.pytest-sqlite.steps[7] (Run pytest (partially))"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    },
    {
      "tool": null,
      "method": "unclassified",
      "commands": [
        "xmllint --format junit.xml > junit.xml-tmp"
      ],
      "triggers": [
        "ci"
      ],
      "evidence": [
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.pytest-full.steps[9] (Beautify test results)"
        },
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.pytest-mariadb.steps[9] (Beautify test results)"
        },
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.pytest-postgres.steps[11] (Beautify test results)"
        },
        {
          "path": ".github/workflows/ci.yaml",
          "locator": "jobs.pytest-partial.steps[9] (Beautify test results)"
        }
      ],
      "upstream": null,
      "docs": null,
      "exit_codes": {},
      "autofix": false,
      "declared_only": false
    }
  ]
}
