{
  "schema_version": 3,
  "app": "home-assistant",
  "display_name": "Home Assistant",
  "upstream_repo": "https://github.com/home-assistant/core",
  "docs_url": "https://www.home-assistant.io/installation/linux/",
  "status": "ok",
  "summary": {
    "primary_service": "homeassistant",
    "app_version": "2026.10.2",
    "app_version_pinned": true,
    "runs": 3,
    "publishable": true,
    "publishable_note": null,
    "idle_total_mem_mib": 308.76,
    "idle_total_cpu_pct": 0.04,
    "peak_total_mem_mib": 309.2,
    "peak_is_under_load": true,
    "startup_seconds": 4.2,
    "startup_peak_total_mem_mib": 342.1,
    "settled": true,
    "settle_seconds_used": 121.1,
    "peak_max_mib": 313.0,
    "sizing_peak_mib": 347.2,
    "idle_mem_mib": {
      "median": 308.76,
      "min": 304.82,
      "max": 310.25,
      "values": [
        310.25,
        304.82,
        308.76
      ]
    },
    "idle_cpu_pct": {
      "median": 0.04,
      "min": 0.01,
      "max": 0.07,
      "values": [
        0.04,
        0.01,
        0.07
      ]
    },
    "peak_mem_mib": {
      "median": 309.2,
      "min": 309.0,
      "max": 313.0,
      "values": [
        313.0,
        309.0,
        309.2
      ]
    },
    "startup_peak_mem_mib": {
      "median": 342.1,
      "min": 336.8,
      "max": 347.2,
      "values": [
        342.1,
        347.2,
        336.8
      ]
    },
    "startup_s": {
      "median": 4.2,
      "min": 3.7,
      "max": 4.4,
      "values": [
        4.4,
        4.2,
        3.7
      ]
    },
    "settled_after_healthy_s": {
      "median": 140.8,
      "min": 140.7,
      "max": 140.9,
      "values": [
        140.9,
        140.8,
        140.7
      ]
    },
    "settled_runs": 3,
    "per_service": {
      "homeassistant": {
        "idle_mem_mib": {
          "median": 308.76,
          "min": 304.82,
          "max": 310.25,
          "values": [
            310.25,
            304.82,
            308.76
          ]
        },
        "peak_mem_mib": {
          "median": 309.2,
          "min": 309.0,
          "max": 313.0,
          "values": [
            313.0,
            309.0,
            309.2
          ]
        }
      }
    },
    "variance_flag": null,
    "representative_run": 3,
    "cpu_models": [
      "AMD EPYC 9V45 96-Core Processor"
    ],
    "cpu_model_mismatch": false,
    "rule": "idle = median of the run idle means; peak = median of the run peaks (highest simultaneous total, under load when the app has a load step); peak_max_mib = highest run peak; sizing_peak_mib = highest over runs of max(run peak, run startup peak); variance_flag when max/min over runs is above 1.5 for idle or peak."
  },
  "run": {
    "started_at": "2026-10-21T02:54:29Z",
    "date": "2026-10-21",
    "harness_version": "3.0.0",
    "runs_requested": 3,
    "docker_host": null,
    "remote": false,
    "runs_completed": 3
  },
  "host": {
    "label": "github-actions ubuntu-latest (2 vCPU, 8 GB)",
    "ci": {
      "runs_on": "ubuntu-latest",
      "runner_environment": "github-hosted",
      "runner_os": "Linux",
      "runner_arch": "X64",
      "image_os": "ubuntu24",
      "image_version": "20261018.339.1"
    },
    "cpu_model": "AMD EPYC 9V45 96-Core Processor",
    "cpu_model_note": null,
    "cores": 2,
    "mem_total_mib": 7933,
    "kernel": "7.0.0-1017-azure",
    "os": "Ubuntu 24.04.5 LTS",
    "arch": "x86_64",
    "oci_arch": "amd64",
    "docker_server_version": "28.0.4",
    "docker_client_version": "28.0.4",
    "compose_client_version": "2.38.2",
    "storage_driver": "overlay2",
    "containerd_image_store": false,
    "source": "docker info + throwaway container reading /proc/cpuinfo on the daemon host",
    "compose_note": "Compose runs on the client machine; Docker server fields are from the daemon host"
  },
  "helper_images": {
    "curlimages/curl:latest": {
      "pulled_as": "curlimages/curl:latest",
      "digest": "curlimages/curl@sha256:11e64e28c5f58c8d93ee95fcf22ac055f48b0bc440e0ce7d8013bbb5ad6aa8ac"
    },
    "python:3.12-slim": {
      "pulled_as": "python:3.12-slim",
      "digest": "python@sha256:a6e34c598f2467ed0e9a8d349809fcd8b5c603269512df273a0bb1784edc11b1"
    }
  },
  "pull_seconds": 56.7,
  "finished_at": "2026-10-21T03:10:53Z",
  "elapsed_seconds": 983.8,
  "services": {
    "homeassistant": {
      "image_ref": "ghcr.io/home-assistant/home-assistant:2026.10.2",
      "image_repo": "ghcr.io/home-assistant/home-assistant",
      "image_tag": "2026.10.2",
      "digest": "sha256:33afb0659d786213264c2211f8d91c5fe87461c56eba6a3a546eb05fc71e89f4",
      "digest_note": null,
      "version": "2026.10.2",
      "version_source": "label:org.opencontainers.image.version",
      "version_pinned": true,
      "version_note": null,
      "resolved_tag": "2026.10.2",
      "resolved_tag_note": null,
      "image_size": {
        "unpacked_mb": 2360.0,
        "unpacked_source": "docker image ls Size: unpacked image on the daemon host, rounded by docker to 3 significant figures",
        "compressed_mb": 652.7,
        "compressed_source": "sum of compressed layer sizes in the registry manifest for linux/amd64",
        "compressed_null_reason": null,
        "unit_note": "MB = 10^6 bytes. unpacked = disk used on the host; compressed = what is downloaded"
      },
      "compose_image": "ghcr.io/home-assistant/home-assistant:2026.10.2",
      "compose_comment": "sha256:33afb0659d786213264c2211f8d91c5fe87461c56eba6a3a546eb05fc71e89f4  (version 2026.10.2, from label:org.opencontainers.image.version)",
      "restart_count": 0,
      "oom_killed": false
    }
  },
  "runs": [
    {
      "run": 1,
      "started_at": "2026-10-21T02:55:32Z",
      "host": {
        "label": "github-actions ubuntu-latest (2 vCPU, 8 GB)",
        "ci": {
          "runs_on": "ubuntu-latest",
          "runner_environment": "github-hosted",
          "runner_os": "Linux",
          "runner_arch": "X64",
          "image_os": "ubuntu24",
          "image_version": "20261018.339.1"
        },
        "cpu_model": "AMD EPYC 9V45 96-Core Processor",
        "cpu_model_note": null,
        "cores": 2,
        "mem_total_mib": 7933,
        "kernel": "7.0.0-1017-azure",
        "os": "Ubuntu 24.04.5 LTS",
        "arch": "x86_64",
        "oci_arch": "amd64",
        "docker_server_version": "28.0.4",
        "docker_client_version": "28.0.4",
        "compose_client_version": "2.38.2",
        "storage_driver": "overlay2",
        "containerd_image_store": false,
        "source": "docker info + throwaway container reading /proc/cpuinfo on the daemon host",
        "compose_note": "Compose runs on the client machine; Docker server fields are from the daemon host"
      },
      "date": "2026-10-21",
      "startup": {
        "seconds": 4.4,
        "ok": true,
        "checks": [
          {
            "type": "http",
            "url": "http://127.0.0.1:8123/api/onboarding",
            "expect_status": [
              200
            ],
            "ok": true,
            "ready_after_s": 4.4,
            "detail": "OK 200"
          }
        ],
        "up_command_seconds": 0.2,
        "definition": "wall clock from starting `docker compose up -d` until every health check passed; checks poll every 0.5 s from a throwaway container on the compose network, so resolution is about +/- 1 s"
      },
      "versions": {
        "homeassistant": "2026.10.2"
      },
      "setup": [
        {
          "exit_code": 0,
          "duration_s": 18.5,
          "reported": {
            "owner_created": true,
            "entities": 122,
            "entity_domains": 40
          },
          "output_tail": [
            "onboarding status: [{\"step\": \"user\", \"done\": false}, {\"step\": \"core_config\", \"done\": false}, {\"step\": \"analytics\", \"done\": false}, {\"step\": \"integration\", \"done\": false}]",
            "POST /api/onboarding/users -> HTTP 200 (auth_code received)",
            "POST /api/onboarding/core_config -> HTTP 200",
            "POST /api/onboarding/analytics -> HTTP 200",
            "POST /api/onboarding/integration -> HTTP 200",
            "onboarding status after: [{\"step\": \"user\", \"done\": true}, {\"step\": \"core_config\", \"done\": true}, {\"step\": \"analytics\", \"done\": true}, {\"step\": \"integration\", \"done\": true}]",
            "config/core/update -> success=True",
            "configuration.yaml before (265 bytes):",
            "",
            "# Loads default set of integrations. Do not remove.",
            "default_config:",
            "",
            "# Load frontend themes from the themes folder",
            "frontend:",
            "  themes: !include_dir_merge_named themes",
            "",
            "automation: !include automations.yaml",
            "script: !include scripts.yaml",
            "scene: !include scenes.yaml",
            "POST /api/services/homeassistant/restart -> HTTP 200",
            "entities after restart: 122",
            "by domain: {\"sensor\": 22, \"media_player\": 8, \"light\": 6, \"update\": 6, \"cover\": 5, \"fan\": 5, \"number\": 5, \"vacuum\": 5, \"lock\": 4, \"text\": 4, \"valve\": 4, \"device_tracker\": 3, \"binary_sensor\": 3, \"camera\": 3, \"climate\": 3, \"humidifier\": 3, \"event\": 2, \"geo_location\": 2, \"air_quality\": 2, \"calendar\": 2, \"remote\": 2, \"siren\": 2, \"switch\": 2, \"water_heater\": 2, \"weather\": 2, \"conversation\": 1, \"zone\": 1, \"person\": 1, \"sun\": 1, \"todo\": 1, \"tts\": 1, \"image_processing\": 1, \"alarm_control_panel\": 1, \"button\": 1, \"date\": 1, \"datetime\": 1, \"notify\": 1, \"select\": 1, \"stt\": 1, \"time\": 1}"
          ],
          "description": "Complete the onboarding through the endpoints the Home Assistant frontend calls (POST /api/onboarding/users, /api/onboarding/core_config, /api/onboarding/analytics, /api/onboarding/integration): create the owner user, finish the steps, then set the name, location, time zone, units and currency over the WebSocket API (config/core/update). Then add the built-in demo integration (`demo:` in configuration.yaml, written through the shared /config volume) and restart Home Assistant through its API (homeassistant.restart). Idle is measured after that: about 120 entities (the demo integration plus Home Assistant's own), no automations, nobody connected."
        }
      ],
      "idle": {
        "per_service": {
          "homeassistant": {
            "samples": 16,
            "mem_mean_mib": 310.25,
            "mem_max_mib": 310.6,
            "cpu_mean_pct": 0.04,
            "cpu_max_pct": 0.15
          }
        },
        "total": {
          "samples": 16,
          "dropped_for_total": 0,
          "mem_mean_mib": 310.25,
          "mem_max_mib": 310.6,
          "cpu_mean_pct": 0.04,
          "cpu_max_pct": 0.15
        },
        "window_seconds": 30.3,
        "series": [
          {
            "t_offset_s": 0.0,
            "total_mem_mib": 310.3,
            "total_cpu_pct": 0.15
          },
          {
            "t_offset_s": 2.0,
            "total_mem_mib": 310.2,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 4.0,
            "total_mem_mib": 310.2,
            "total_cpu_pct": 0.03
          },
          {
            "t_offset_s": 6.1,
            "total_mem_mib": 310.2,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 8.1,
            "total_mem_mib": 310.0,
            "total_cpu_pct": 0.03
          },
          {
            "t_offset_s": 10.1,
            "total_mem_mib": 310.3,
            "total_cpu_pct": 0.14
          },
          {
            "t_offset_s": 12.1,
            "total_mem_mib": 310.3,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 14.1,
            "total_mem_mib": 310.3,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 16.1,
            "total_mem_mib": 310.3,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 18.2,
            "total_mem_mib": 310.3,
            "total_cpu_pct": 0.03
          },
          {
            "t_offset_s": 20.2,
            "total_mem_mib": 310.4,
            "total_cpu_pct": 0.14
          },
          {
            "t_offset_s": 22.2,
            "total_mem_mib": 310.3,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 24.2,
            "total_mem_mib": 310.3,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 26.2,
            "total_mem_mib": 310.0,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 28.3,
            "total_mem_mib": 310.0,
            "total_cpu_pct": 0.03
          },
          {
            "t_offset_s": 30.3,
            "total_mem_mib": 310.6,
            "total_cpu_pct": 0.14
          }
        ],
        "memory_stat": {
          "read_at": "2026-10-21T02:58:28Z",
          "per_service": {
            "homeassistant": {
              "cgroup": "v2",
              "anon_mib": 292.5,
              "file_mib": 44.59,
              "active_file_mib": 0.0,
              "inactive_file_mib": 44.59,
              "shmem_mib": 0.0
            }
          },
          "read_lag_s": 0.0,
          "method": "docker exec <container> cat /sys/fs/cgroup/memory.stat (cgroup v1: /sys/fs/cgroup/memory/memory.stat); MiB; splits what docker stats shows as one number into anon (heap) and file cache; a field that is absent was not printed by the kernel or not readable (see reason)",
          "taken": "right after the idle window"
        }
      },
      "settle": {
        "settled": true,
        "mode": "detected",
        "settle_seconds_used": 121.1,
        "settle_started_after_healthy_s": 19.8,
        "params": {
          "window_seconds": 60,
          "threshold_pct": 2.0,
          "threshold_min_mib": 10.0,
          "min_seconds": 120,
          "max_seconds": 600
        },
        "last_window": {
          "n": 30,
          "mean_mib": 310.16,
          "min_mib": 309.9,
          "max_mib": 310.4,
          "spread_mib": 0.5,
          "threshold_mib": 10.0
        },
        "rechecks": 0,
        "rule": "settled = over the last window_seconds the stack total varied (max - min) by less than max(threshold_pct of the window mean, threshold_min_mib); not before min_seconds, at the latest max_seconds, both counted from the end of the setup steps; the idle window must also be flat and agree with it. If max_seconds passes without settling, settled=false and the idle window is measured anyway."
      },
      "startup_peak": {
        "per_service_mem_mib": {
          "homeassistant": 342.1
        },
        "total_mem_mib": 342.1,
        "samples": 70,
        "note": "highest value across docker stats samples (about one every 2-3 s) from healthy until the stack settled; shorter spikes between samples are not seen"
      },
      "timeline": {
        "step_s": 10,
        "t0": "healthy",
        "offsets_s": [
          10,
          20,
          30,
          40,
          50,
          60,
          70,
          80,
          90,
          100,
          110,
          120,
          130,
          140,
          150,
          160,
          170,
          180
        ],
        "total_mem_mib": [
          253.0,
          309.6,
          310.2,
          310.0,
          310.1,
          310.2,
          310.0,
          310.2,
          310.1,
          310.2,
          310.4,
          310.0,
          310.2,
          310.0,
          310.2,
          310.3,
          310.2,
          310.6
        ],
        "per_service_mem_mib": {
          "homeassistant": [
            253.0,
            309.6,
            310.2,
            310.0,
            310.1,
            310.2,
            310.0,
            310.2,
            310.1,
            310.2,
            310.4,
            310.0,
            310.2,
            310.0,
            310.2,
            310.3,
            310.2,
            310.6
          ]
        }
      },
      "load": {
        "per_service": {
          "homeassistant": {
            "samples": 62,
            "mem_mean_mib": 311.83,
            "mem_max_mib": 313.0,
            "cpu_mean_pct": 0.38,
            "cpu_max_pct": 1.22
          }
        },
        "total": {
          "samples": 62,
          "dropped_for_total": 0,
          "mem_mean_mib": 311.83,
          "mem_max_mib": 313.0,
          "cpu_mean_pct": 0.38,
          "cpu_max_pct": 1.22
        },
        "description": "Eight automations that fire all the time, plus one client. A Python script (standard library only, on the host network) logs in as the owner and creates the automations through the config API the automation editor uses (POST /api/config/automation/config/<id>). Six time_pattern automations (every 2, 3, 4, 5, 6 and 7 seconds) toggle or set the demo lights, switches, fans, a cover, a humidifier and a thermostat (temperatures in degrees F, the lab's unit system), one automation reacts to a light's state change by firing an event, and one writes a persistent notification once a minute. The script then keeps one WebSocket subscription to state_changed events for 120 seconds and counts them, and reads the server's error log at the end to count automation errors (it reports the number; the run expects 0). Every state change and event is written to the recorder's SQLite database. No dashboard is open, no mobile app, no voice, no real devices.",
        "duration_s": 120.6,
        "window": "from LAB_MARK load_start (or step start) until 2 s after the step ended",
        "reported_by_script": {
          "automations": 8,
          "load_seconds": 120.5,
          "state_changed_events": 846,
          "state_changes_per_s": 7.02,
          "entities": 130,
          "automation_errors_in_log": 0
        },
        "output_tail": [
          "create automation lab_switches_toggle_7s -> HTTP 200 {\"result\": \"ok\"}",
          "create automation lab_thermostat_3s -> HTTP 200 {\"result\": \"ok\"}",
          "create automation lab_brightness_4s -> HTTP 200 {\"result\": \"ok\"}",
          "create automation lab_fan_cover_6s -> HTTP 200 {\"result\": \"ok\"}",
          "create automation lab_humidifier_2s -> HTTP 200 {\"result\": \"ok\"}",
          "create automation lab_react_to_light -> HTTP 200 {\"result\": \"ok\"}",
          "create automation lab_notify_60s -> HTTP 200 {\"result\": \"ok\"}",
          "automation entities: 8, states: ['on']",
          "state_changed events in 121 s: 846 (7.0 per second); busiest: [[\"automation.lab_toggle_a_humidifier_every_2_s\", 120], [\"automation.lab_fire_an_event_when_the_bed_light_changes\", 108], [\"automation.lab_random_thermostat_target_every_3_s\", 80], [\"automation.lab_random_brightness_every_4_s\", 61], [\"humidifier.humidifier\", 60]]",
          "automation errors in the error log: 0"
        ],
        "series": [
          {
            "t_offset_s": 0.0,
            "total_mem_mib": 309.9,
            "total_cpu_pct": 0.02
          },
          {
            "t_offset_s": 2.0,
            "total_mem_mib": 310.1,
            "total_cpu_pct": 0.26
          },
          {
            "t_offset_s": 4.0,
            "total_mem_mib": 310.2,
            "total_cpu_pct": 0.48
          },
          {
            "t_offset_s": 6.0,
            "total_mem_mib": 310.2,
            "total_cpu_pct": 1.08
          },
          {
            "t_offset_s": 8.0,
            "total_mem_mib": 310.5,
            "total_cpu_pct": 0.29
          },
          {
            "t_offset_s": 10.0,
            "total_mem_mib": 310.5,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 12.0,
            "total_mem_mib": 310.8,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 14.0,
            "total_mem_mib": 310.8,
            "total_cpu_pct": 0.61
          },
          {
            "t_offset_s": 16.0,
            "total_mem_mib": 311.0,
            "total_cpu_pct": 1.07
          },
          {
            "t_offset_s": 18.0,
            "total_mem_mib": 311.2,
            "total_cpu_pct": 0.17
          },
          {
            "t_offset_s": 20.0,
            "total_mem_mib": 311.3,
            "total_cpu_pct": 0.16
          },
          {
            "t_offset_s": 22.0,
            "total_mem_mib": 311.4,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 24.1,
            "total_mem_mib": 311.4,
            "total_cpu_pct": 0.52
          },
          {
            "t_offset_s": 26.1,
            "total_mem_mib": 311.8,
            "total_cpu_pct": 1.22
          },
          {
            "t_offset_s": 28.1,
            "total_mem_mib": 311.5,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 30.1,
            "total_mem_mib": 311.8,
            "total_cpu_pct": 0.03
          },
          {
            "t_offset_s": 32.1,
            "total_mem_mib": 311.7,
            "total_cpu_pct": 0.16
          },
          {
            "t_offset_s": 34.1,
            "total_mem_mib": 311.7,
            "total_cpu_pct": 0.3
          },
          {
            "t_offset_s": 36.1,
            "total_mem_mib": 311.7,
            "total_cpu_pct": 1.08
          },
          {
            "t_offset_s": 38.1,
            "total_mem_mib": 311.6,
            "total_cpu_pct": 0.26
          },
          {
            "t_offset_s": 40.1,
            "total_mem_mib": 311.6,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 42.1,
            "total_mem_mib": 311.7,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 44.1,
            "total_mem_mib": 312.0,
            "total_cpu_pct": 0.41
          },
          {
            "t_offset_s": 46.1,
            "total_mem_mib": 311.9,
            "total_cpu_pct": 1.21
          },
          {
            "t_offset_s": 48.1,
            "total_mem_mib": 311.8,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 50.1,
            "total_mem_mib": 311.8,
            "total_cpu_pct": 0.34
          },
          {
            "t_offset_s": 52.1,
            "total_mem_mib": 311.9,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 54.1,
            "total_mem_mib": 311.9,
            "total_cpu_pct": 0.67
          },
          {
            "t_offset_s": 56.1,
            "total_mem_mib": 312.1,
            "total_cpu_pct": 1.18
          },
          {
            "t_offset_s": 58.1,
            "total_mem_mib": 311.9,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 60.1,
            "total_mem_mib": 311.9,
            "total_cpu_pct": 0.03
          },
          {
            "t_offset_s": 62.1,
            "total_mem_mib": 312.0,
            "total_cpu_pct": 0.17
          },
          {
            "t_offset_s": 64.1,
            "total_mem_mib": 312.0,
            "total_cpu_pct": 0.45
          },
          {
            "t_offset_s": 66.1,
            "total_mem_mib": 312.1,
            "total_cpu_pct": 1.1
          },
          {
            "t_offset_s": 68.1,
            "total_mem_mib": 311.9,
            "total_cpu_pct": 0.29
          },
          {
            "t_offset_s": 70.1,
            "total_mem_mib": 311.9,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 72.1,
            "total_mem_mib": 312.0,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 74.1,
            "total_mem_mib": 312.3,
            "total_cpu_pct": 0.38
          },
          {
            "t_offset_s": 76.1,
            "total_mem_mib": 312.2,
            "total_cpu_pct": 1.1
          },
          {
            "t_offset_s": 78.2,
            "total_mem_mib": 312.2,
            "total_cpu_pct": 0.18
          },
          {
            "t_offset_s": 80.2,
            "total_mem_mib": 312.1,
            "total_cpu_pct": 0.17
          },
          {
            "t_offset_s": 82.2,
            "total_mem_mib": 312.2,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 84.2,
            "total_mem_mib": 311.9,
            "total_cpu_pct": 0.3
          },
          {
            "t_offset_s": 86.2,
            "total_mem_mib": 312.1,
            "total_cpu_pct": 1.19
          },
          {
            "t_offset_s": 88.2,
            "total_mem_mib": 312.1,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 90.2,
            "total_mem_mib": 312.1,
            "total_cpu_pct": 0.02
          },
          {
            "t_offset_s": 92.2,
            "total_mem_mib": 312.4,
            "total_cpu_pct": 0.16
          },
          {
            "t_offset_s": 94.2,
            "total_mem_mib": 312.0,
            "total_cpu_pct": 0.3
          },
          {
            "t_offset_s": 96.2,
            "total_mem_mib": 311.9,
            "total_cpu_pct": 1.16
          },
          {
            "t_offset_s": 98.2,
            "total_mem_mib": 312.2,
            "total_cpu_pct": 0.16
          },
          {
            "t_offset_s": 100.2,
            "total_mem_mib": 312.7,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 102.2,
            "total_mem_mib": 312.5,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 104.2,
            "total_mem_mib": 312.5,
            "total_cpu_pct": 0.55
          },
          {
            "t_offset_s": 106.2,
            "total_mem_mib": 312.6,
            "total_cpu_pct": 1.07
          },
          {
            "t_offset_s": 108.2,
            "total_mem_mib": 312.6,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 110.2,
            "total_mem_mib": 312.6,
            "total_cpu_pct": 0.65
          },
          {
            "t_offset_s": 112.2,
            "total_mem_mib": 312.7,
            "total_cpu_pct": 0.06
          },
          {
            "t_offset_s": 114.2,
            "total_mem_mib": 312.7,
            "total_cpu_pct": 0.29
          },
          {
            "t_offset_s": 116.2,
            "total_mem_mib": 312.7,
            "total_cpu_pct": 0.99
          },
          {
            "t_offset_s": 118.2,
            "total_mem_mib": 312.7,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 120.2,
            "total_mem_mib": 313.0,
            "total_cpu_pct": 0.75
          },
          {
            "t_offset_s": 122.2,
            "total_mem_mib": 312.9,
            "total_cpu_pct": 0.21
          }
        ],
        "series_start_offset_s": 0.4,
        "peak_note": "peak = highest value seen across docker stats samples (about one every 2-3 s); shorter spikes between samples are not seen",
        "peak_memory_stat": {
          "read_at": "2026-10-21T03:00:32Z",
          "per_service": {
            "homeassistant": {
              "cgroup": "v2",
              "anon_mib": 294.79,
              "file_mib": 48.2,
              "active_file_mib": 0.0,
              "inactive_file_mib": 48.2,
              "shmem_mib": 0.0
            }
          },
          "read_lag_s": 0.0,
          "series_index": 60,
          "sample_t_offset_s": 120.2,
          "total_mem_mib": 313.0
        }
      },
      "container_end_state": {
        "homeassistant": {
          "restart_count": 0,
          "oom_killed": false
        }
      },
      "teardown": {
        "done": true,
        "volumes_removed": true,
        "images_removed": false,
        "error": null
      },
      "warnings": [],
      "finished_at": "2026-10-21T03:00:39Z",
      "elapsed_seconds": 306.6
    },
    {
      "run": 2,
      "started_at": "2026-10-21T03:00:39Z",
      "host": {
        "label": "github-actions ubuntu-latest (2 vCPU, 8 GB)",
        "ci": {
          "runs_on": "ubuntu-latest",
          "runner_environment": "github-hosted",
          "runner_os": "Linux",
          "runner_arch": "X64",
          "image_os": "ubuntu24",
          "image_version": "20261018.339.1"
        },
        "cpu_model": "AMD EPYC 9V45 96-Core Processor",
        "cpu_model_note": null,
        "cores": 2,
        "mem_total_mib": 7933,
        "kernel": "7.0.0-1017-azure",
        "os": "Ubuntu 24.04.5 LTS",
        "arch": "x86_64",
        "oci_arch": "amd64",
        "docker_server_version": "28.0.4",
        "docker_client_version": "28.0.4",
        "compose_client_version": "2.38.2",
        "storage_driver": "overlay2",
        "containerd_image_store": false,
        "source": "docker info + throwaway container reading /proc/cpuinfo on the daemon host",
        "compose_note": "Compose runs on the client machine; Docker server fields are from the daemon host"
      },
      "date": "2026-10-21",
      "startup": {
        "seconds": 4.2,
        "ok": true,
        "checks": [
          {
            "type": "http",
            "url": "http://127.0.0.1:8123/api/onboarding",
            "expect_status": [
              200
            ],
            "ok": true,
            "ready_after_s": 4.2,
            "detail": "OK 200"
          }
        ],
        "up_command_seconds": 0.2,
        "definition": "wall clock from starting `docker compose up -d` until every health check passed; checks poll every 0.5 s from a throwaway container on the compose network, so resolution is about +/- 1 s"
      },
      "versions": {
        "homeassistant": "2026.10.2"
      },
      "setup": [
        {
          "exit_code": 0,
          "duration_s": 19.1,
          "reported": {
            "owner_created": true,
            "entities": 122,
            "entity_domains": 40
          },
          "output_tail": [
            "onboarding status: [{\"step\": \"user\", \"done\": false}, {\"step\": \"core_config\", \"done\": false}, {\"step\": \"analytics\", \"done\": false}, {\"step\": \"integration\", \"done\": false}]",
            "POST /api/onboarding/users -> HTTP 200 (auth_code received)",
            "POST /api/onboarding/core_config -> HTTP 200",
            "POST /api/onboarding/analytics -> HTTP 200",
            "POST /api/onboarding/integration -> HTTP 200",
            "onboarding status after: [{\"step\": \"user\", \"done\": true}, {\"step\": \"core_config\", \"done\": true}, {\"step\": \"analytics\", \"done\": true}, {\"step\": \"integration\", \"done\": true}]",
            "config/core/update -> success=True",
            "configuration.yaml before (265 bytes):",
            "",
            "# Loads default set of integrations. Do not remove.",
            "default_config:",
            "",
            "# Load frontend themes from the themes folder",
            "frontend:",
            "  themes: !include_dir_merge_named themes",
            "",
            "automation: !include automations.yaml",
            "script: !include scripts.yaml",
            "scene: !include scenes.yaml",
            "POST /api/services/homeassistant/restart -> HTTP 200",
            "entities after restart: 122",
            "by domain: {\"sensor\": 22, \"media_player\": 8, \"light\": 6, \"update\": 6, \"cover\": 5, \"fan\": 5, \"number\": 5, \"vacuum\": 5, \"lock\": 4, \"text\": 4, \"valve\": 4, \"device_tracker\": 3, \"binary_sensor\": 3, \"camera\": 3, \"climate\": 3, \"humidifier\": 3, \"event\": 2, \"geo_location\": 2, \"air_quality\": 2, \"calendar\": 2, \"remote\": 2, \"siren\": 2, \"switch\": 2, \"water_heater\": 2, \"weather\": 2, \"conversation\": 1, \"zone\": 1, \"person\": 1, \"sun\": 1, \"image_processing\": 1, \"alarm_control_panel\": 1, \"button\": 1, \"date\": 1, \"datetime\": 1, \"notify\": 1, \"select\": 1, \"stt\": 1, \"time\": 1, \"todo\": 1, \"tts\": 1}"
          ],
          "description": "Complete the onboarding through the endpoints the Home Assistant frontend calls (POST /api/onboarding/users, /api/onboarding/core_config, /api/onboarding/analytics, /api/onboarding/integration): create the owner user, finish the steps, then set the name, location, time zone, units and currency over the WebSocket API (config/core/update). Then add the built-in demo integration (`demo:` in configuration.yaml, written through the shared /config volume) and restart Home Assistant through its API (homeassistant.restart). Idle is measured after that: about 120 entities (the demo integration plus Home Assistant's own), no automations, nobody connected."
        }
      ],
      "idle": {
        "per_service": {
          "homeassistant": {
            "samples": 16,
            "mem_mean_mib": 304.82,
            "mem_max_mib": 304.9,
            "cpu_mean_pct": 0.01,
            "cpu_max_pct": 0.04
          }
        },
        "total": {
          "samples": 16,
          "dropped_for_total": 0,
          "mem_mean_mib": 304.82,
          "mem_max_mib": 304.9,
          "cpu_mean_pct": 0.01,
          "cpu_max_pct": 0.04
        },
        "window_seconds": 30.3,
        "series": [
          {
            "t_offset_s": 0.0,
            "total_mem_mib": 304.9,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 2.0,
            "total_mem_mib": 304.9,
            "total_cpu_pct": 0.02
          },
          {
            "t_offset_s": 4.0,
            "total_mem_mib": 304.9,
            "total_cpu_pct": 0.04
          },
          {
            "t_offset_s": 6.1,
            "total_mem_mib": 304.9,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 8.1,
            "total_mem_mib": 304.9,
            "total_cpu_pct": 0.01
          },
          {
            "t_offset_s": 10.1,
            "total_mem_mib": 304.9,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 12.1,
            "total_mem_mib": 304.9,
            "total_cpu_pct": 0.03
          },
          {
            "t_offset_s": 14.1,
            "total_mem_mib": 304.9,
            "total_cpu_pct": 0.01
          },
          {
            "t_offset_s": 16.1,
            "total_mem_mib": 304.9,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 18.2,
            "total_mem_mib": 304.7,
            "total_cpu_pct": 0.01
          },
          {
            "t_offset_s": 20.2,
            "total_mem_mib": 304.7,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 22.2,
            "total_mem_mib": 304.7,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 24.2,
            "total_mem_mib": 304.7,
            "total_cpu_pct": 0.01
          },
          {
            "t_offset_s": 26.2,
            "total_mem_mib": 304.7,
            "total_cpu_pct": 0.02
          },
          {
            "t_offset_s": 28.2,
            "total_mem_mib": 304.7,
            "total_cpu_pct": 0.02
          },
          {
            "t_offset_s": 30.3,
            "total_mem_mib": 304.8,
            "total_cpu_pct": 0.0
          }
        ],
        "memory_stat": {
          "read_at": "2026-10-21T03:03:35Z",
          "per_service": {
            "homeassistant": {
              "cgroup": "v2",
              "anon_mib": 288.17,
              "file_mib": 43.22,
              "active_file_mib": 0.0,
              "inactive_file_mib": 43.22,
              "shmem_mib": 0.0
            }
          },
          "read_lag_s": 0.0,
          "method": "docker exec <container> cat /sys/fs/cgroup/memory.stat (cgroup v1: /sys/fs/cgroup/memory/memory.stat); MiB; splits what docker stats shows as one number into anon (heap) and file cache; a field that is absent was not printed by the kernel or not readable (see reason)",
          "taken": "right after the idle window"
        }
      },
      "settle": {
        "settled": true,
        "mode": "detected",
        "settle_seconds_used": 121.1,
        "settle_started_after_healthy_s": 19.7,
        "params": {
          "window_seconds": 60,
          "threshold_pct": 2.0,
          "threshold_min_mib": 10.0,
          "min_seconds": 120,
          "max_seconds": 600
        },
        "last_window": {
          "n": 30,
          "mean_mib": 304.66,
          "min_mib": 304.3,
          "max_mib": 304.9,
          "spread_mib": 0.6,
          "threshold_mib": 10.0
        },
        "rechecks": 0,
        "rule": "settled = over the last window_seconds the stack total varied (max - min) by less than max(threshold_pct of the window mean, threshold_min_mib); not before min_seconds, at the latest max_seconds, both counted from the end of the setup steps; the idle window must also be flat and agree with it. If max_seconds passes without settling, settled=false and the idle window is measured anyway."
      },
      "startup_peak": {
        "per_service_mem_mib": {
          "homeassistant": 347.2
        },
        "total_mem_mib": 347.2,
        "samples": 70,
        "note": "highest value across docker stats samples (about one every 2-3 s) from healthy until the stack settled; shorter spikes between samples are not seen"
      },
      "timeline": {
        "step_s": 10,
        "t0": "healthy",
        "offsets_s": [
          10,
          20,
          30,
          40,
          50,
          60,
          70,
          80,
          90,
          100,
          110,
          120,
          130,
          140,
          150,
          160,
          170,
          180
        ],
        "total_mem_mib": [
          263.8,
          305.5,
          305.7,
          304.9,
          304.5,
          304.6,
          304.7,
          304.6,
          304.4,
          304.7,
          304.7,
          304.7,
          304.8,
          304.6,
          304.9,
          304.9,
          304.7,
          304.8
        ],
        "per_service_mem_mib": {
          "homeassistant": [
            263.8,
            305.5,
            305.7,
            304.9,
            304.5,
            304.6,
            304.7,
            304.6,
            304.4,
            304.7,
            304.7,
            304.7,
            304.8,
            304.6,
            304.9,
            304.9,
            304.7,
            304.8
          ]
        }
      },
      "load": {
        "per_service": {
          "homeassistant": {
            "samples": 62,
            "mem_mean_mib": 308.05,
            "mem_max_mib": 309.0,
            "cpu_mean_pct": 1.15,
            "cpu_max_pct": 26.17
          }
        },
        "total": {
          "samples": 62,
          "dropped_for_total": 0,
          "mem_mean_mib": 308.05,
          "mem_max_mib": 309.0,
          "cpu_mean_pct": 1.15,
          "cpu_max_pct": 26.17
        },
        "description": "Eight automations that fire all the time, plus one client. A Python script (standard library only, on the host network) logs in as the owner and creates the automations through the config API the automation editor uses (POST /api/config/automation/config/<id>). Six time_pattern automations (every 2, 3, 4, 5, 6 and 7 seconds) toggle or set the demo lights, switches, fans, a cover, a humidifier and a thermostat (temperatures in degrees F, the lab's unit system), one automation reacts to a light's state change by firing an event, and one writes a persistent notification once a minute. The script then keeps one WebSocket subscription to state_changed events for 120 seconds and counts them, and reads the server's error log at the end to count automation errors (it reports the number; the run expects 0). Every state change and event is written to the recorder's SQLite database. No dashboard is open, no mobile app, no voice, no real devices.",
        "duration_s": 120.9,
        "window": "from LAB_MARK load_start (or step start) until 2 s after the step ended",
        "reported_by_script": {
          "automations": 8,
          "load_seconds": 120.8,
          "state_changed_events": 850,
          "state_changes_per_s": 7.04,
          "entities": 130,
          "automation_errors_in_log": 0
        },
        "output_tail": [
          "create automation lab_switches_toggle_7s -> HTTP 200 {\"result\": \"ok\"}",
          "create automation lab_thermostat_3s -> HTTP 200 {\"result\": \"ok\"}",
          "create automation lab_brightness_4s -> HTTP 200 {\"result\": \"ok\"}",
          "create automation lab_fan_cover_6s -> HTTP 200 {\"result\": \"ok\"}",
          "create automation lab_humidifier_2s -> HTTP 200 {\"result\": \"ok\"}",
          "create automation lab_react_to_light -> HTTP 200 {\"result\": \"ok\"}",
          "create automation lab_notify_60s -> HTTP 200 {\"result\": \"ok\"}",
          "automation entities: 8, states: ['on']",
          "state_changed events in 121 s: 850 (7.0 per second); busiest: [[\"automation.lab_toggle_a_humidifier_every_2_s\", 120], [\"automation.lab_fire_an_event_when_the_bed_light_changes\", 108], [\"automation.lab_random_thermostat_target_every_3_s\", 80], [\"humidifier.humidifier\", 60], [\"automation.lab_random_brightness_every_4_s\", 60]]",
          "automation errors in the error log: 0"
        ],
        "series": [
          {
            "t_offset_s": 0.0,
            "total_mem_mib": 306.1,
            "total_cpu_pct": 1.71
          },
          {
            "t_offset_s": 2.0,
            "total_mem_mib": 306.1,
            "total_cpu_pct": 0.75
          },
          {
            "t_offset_s": 4.0,
            "total_mem_mib": 305.9,
            "total_cpu_pct": 0.93
          },
          {
            "t_offset_s": 6.0,
            "total_mem_mib": 306.1,
            "total_cpu_pct": 0.43
          },
          {
            "t_offset_s": 8.0,
            "total_mem_mib": 306.5,
            "total_cpu_pct": 0.27
          },
          {
            "t_offset_s": 10.0,
            "total_mem_mib": 306.5,
            "total_cpu_pct": 2.67
          },
          {
            "t_offset_s": 12.0,
            "total_mem_mib": 306.7,
            "total_cpu_pct": 0.5
          },
          {
            "t_offset_s": 14.0,
            "total_mem_mib": 307.1,
            "total_cpu_pct": 0.41
          },
          {
            "t_offset_s": 16.0,
            "total_mem_mib": 307.1,
            "total_cpu_pct": 0.64
          },
          {
            "t_offset_s": 18.0,
            "total_mem_mib": 307.5,
            "total_cpu_pct": 0.58
          },
          {
            "t_offset_s": 20.0,
            "total_mem_mib": 307.4,
            "total_cpu_pct": 1.08
          },
          {
            "t_offset_s": 22.0,
            "total_mem_mib": 307.4,
            "total_cpu_pct": 1.53
          },
          {
            "t_offset_s": 24.0,
            "total_mem_mib": 307.3,
            "total_cpu_pct": 0.15
          },
          {
            "t_offset_s": 26.1,
            "total_mem_mib": 307.5,
            "total_cpu_pct": 0.43
          },
          {
            "t_offset_s": 28.1,
            "total_mem_mib": 307.7,
            "total_cpu_pct": 0.56
          },
          {
            "t_offset_s": 30.1,
            "total_mem_mib": 307.6,
            "total_cpu_pct": 1.3
          },
          {
            "t_offset_s": 32.1,
            "total_mem_mib": 307.6,
            "total_cpu_pct": 0.41
          },
          {
            "t_offset_s": 34.1,
            "total_mem_mib": 307.8,
            "total_cpu_pct": 0.95
          },
          {
            "t_offset_s": 36.1,
            "total_mem_mib": 307.9,
            "total_cpu_pct": 0.33
          },
          {
            "t_offset_s": 38.1,
            "total_mem_mib": 307.9,
            "total_cpu_pct": 0.4
          },
          {
            "t_offset_s": 40.1,
            "total_mem_mib": 308.2,
            "total_cpu_pct": 1.41
          },
          {
            "t_offset_s": 42.1,
            "total_mem_mib": 307.9,
            "total_cpu_pct": 0.7
          },
          {
            "t_offset_s": 44.1,
            "total_mem_mib": 308.1,
            "total_cpu_pct": 0.15
          },
          {
            "t_offset_s": 46.1,
            "total_mem_mib": 308.3,
            "total_cpu_pct": 1.19
          },
          {
            "t_offset_s": 48.1,
            "total_mem_mib": 308.1,
            "total_cpu_pct": 0.16
          },
          {
            "t_offset_s": 50.1,
            "total_mem_mib": 308.3,
            "total_cpu_pct": 1.36
          },
          {
            "t_offset_s": 52.1,
            "total_mem_mib": 308.3,
            "total_cpu_pct": 0.79
          },
          {
            "t_offset_s": 54.1,
            "total_mem_mib": 308.1,
            "total_cpu_pct": 0.51
          },
          {
            "t_offset_s": 56.1,
            "total_mem_mib": 308.3,
            "total_cpu_pct": 0.19
          },
          {
            "t_offset_s": 58.1,
            "total_mem_mib": 308.3,
            "total_cpu_pct": 0.82
          },
          {
            "t_offset_s": 60.1,
            "total_mem_mib": 308.3,
            "total_cpu_pct": 1.0
          },
          {
            "t_offset_s": 62.1,
            "total_mem_mib": 308.2,
            "total_cpu_pct": 0.65
          },
          {
            "t_offset_s": 64.1,
            "total_mem_mib": 308.2,
            "total_cpu_pct": 0.75
          },
          {
            "t_offset_s": 66.1,
            "total_mem_mib": 308.3,
            "total_cpu_pct": 0.46
          },
          {
            "t_offset_s": 68.1,
            "total_mem_mib": 308.3,
            "total_cpu_pct": 0.16
          },
          {
            "t_offset_s": 70.1,
            "total_mem_mib": 308.5,
            "total_cpu_pct": 1.43
          },
          {
            "t_offset_s": 72.1,
            "total_mem_mib": 308.3,
            "total_cpu_pct": 0.45
          },
          {
            "t_offset_s": 74.1,
            "total_mem_mib": 308.5,
            "total_cpu_pct": 0.64
          },
          {
            "t_offset_s": 76.1,
            "total_mem_mib": 308.6,
            "total_cpu_pct": 0.57
          },
          {
            "t_offset_s": 78.1,
            "total_mem_mib": 308.4,
            "total_cpu_pct": 0.6
          },
          {
            "t_offset_s": 80.2,
            "total_mem_mib": 308.3,
            "total_cpu_pct": 0.96
          },
          {
            "t_offset_s": 82.2,
            "total_mem_mib": 308.2,
            "total_cpu_pct": 1.38
          },
          {
            "t_offset_s": 84.2,
            "total_mem_mib": 308.6,
            "total_cpu_pct": 0.31
          },
          {
            "t_offset_s": 86.2,
            "total_mem_mib": 308.3,
            "total_cpu_pct": 0.44
          },
          {
            "t_offset_s": 88.2,
            "total_mem_mib": 308.3,
            "total_cpu_pct": 0.57
          },
          {
            "t_offset_s": 90.2,
            "total_mem_mib": 308.4,
            "total_cpu_pct": 1.29
          },
          {
            "t_offset_s": 92.2,
            "total_mem_mib": 308.9,
            "total_cpu_pct": 26.17
          },
          {
            "t_offset_s": 94.2,
            "total_mem_mib": 308.9,
            "total_cpu_pct": 0.95
          },
          {
            "t_offset_s": 96.2,
            "total_mem_mib": 308.9,
            "total_cpu_pct": 0.35
          },
          {
            "t_offset_s": 98.2,
            "total_mem_mib": 308.9,
            "total_cpu_pct": 0.42
          },
          {
            "t_offset_s": 100.2,
            "total_mem_mib": 309.0,
            "total_cpu_pct": 1.29
          },
          {
            "t_offset_s": 102.2,
            "total_mem_mib": 308.8,
            "total_cpu_pct": 0.7
          },
          {
            "t_offset_s": 104.2,
            "total_mem_mib": 309.0,
            "total_cpu_pct": 0.34
          },
          {
            "t_offset_s": 106.2,
            "total_mem_mib": 308.9,
            "total_cpu_pct": 0.84
          },
          {
            "t_offset_s": 108.2,
            "total_mem_mib": 308.9,
            "total_cpu_pct": 0.17
          },
          {
            "t_offset_s": 110.2,
            "total_mem_mib": 308.9,
            "total_cpu_pct": 1.38
          },
          {
            "t_offset_s": 112.2,
            "total_mem_mib": 308.5,
            "total_cpu_pct": 0.85
          },
          {
            "t_offset_s": 114.2,
            "total_mem_mib": 308.9,
            "total_cpu_pct": 0.6
          },
          {
            "t_offset_s": 116.2,
            "total_mem_mib": 308.8,
            "total_cpu_pct": 0.15
          },
          {
            "t_offset_s": 118.2,
            "total_mem_mib": 308.8,
            "total_cpu_pct": 0.84
          },
          {
            "t_offset_s": 120.2,
            "total_mem_mib": 308.8,
            "total_cpu_pct": 1.0
          },
          {
            "t_offset_s": 122.2,
            "total_mem_mib": 308.6,
            "total_cpu_pct": 0.48
          }
        ],
        "series_start_offset_s": 0.5,
        "peak_note": "peak = highest value seen across docker stats samples (about one every 2-3 s); shorter spikes between samples are not seen",
        "peak_memory_stat": {
          "read_at": "2026-10-21T03:05:19Z",
          "per_service": {
            "homeassistant": {
              "cgroup": "v2",
              "anon_mib": 292.02,
              "file_mib": 46.1,
              "active_file_mib": 0.0,
              "inactive_file_mib": 46.1,
              "shmem_mib": 0.0
            }
          },
          "read_lag_s": 0.0,
          "series_index": 50,
          "sample_t_offset_s": 100.2,
          "total_mem_mib": 309.0
        }
      },
      "container_end_state": {
        "homeassistant": {
          "restart_count": 0,
          "oom_killed": false
        }
      },
      "teardown": {
        "done": true,
        "volumes_removed": true,
        "images_removed": false,
        "error": null
      },
      "warnings": [],
      "finished_at": "2026-10-21T03:05:46Z",
      "elapsed_seconds": 307.0
    },
    {
      "run": 3,
      "started_at": "2026-10-21T03:05:46Z",
      "host": {
        "label": "github-actions ubuntu-latest (2 vCPU, 8 GB)",
        "ci": {
          "runs_on": "ubuntu-latest",
          "runner_environment": "github-hosted",
          "runner_os": "Linux",
          "runner_arch": "X64",
          "image_os": "ubuntu24",
          "image_version": "20261018.339.1"
        },
        "cpu_model": "AMD EPYC 9V45 96-Core Processor",
        "cpu_model_note": null,
        "cores": 2,
        "mem_total_mib": 7933,
        "kernel": "7.0.0-1017-azure",
        "os": "Ubuntu 24.04.5 LTS",
        "arch": "x86_64",
        "oci_arch": "amd64",
        "docker_server_version": "28.0.4",
        "docker_client_version": "28.0.4",
        "compose_client_version": "2.38.2",
        "storage_driver": "overlay2",
        "containerd_image_store": false,
        "source": "docker info + throwaway container reading /proc/cpuinfo on the daemon host",
        "compose_note": "Compose runs on the client machine; Docker server fields are from the daemon host"
      },
      "date": "2026-10-21",
      "startup": {
        "seconds": 3.7,
        "ok": true,
        "checks": [
          {
            "type": "http",
            "url": "http://127.0.0.1:8123/api/onboarding",
            "expect_status": [
              200
            ],
            "ok": true,
            "ready_after_s": 3.7,
            "detail": "OK 200"
          }
        ],
        "up_command_seconds": 0.2,
        "definition": "wall clock from starting `docker compose up -d` until every health check passed; checks poll every 0.5 s from a throwaway container on the compose network, so resolution is about +/- 1 s"
      },
      "versions": {
        "homeassistant": "2026.10.2"
      },
      "setup": [
        {
          "exit_code": 0,
          "duration_s": 19.6,
          "reported": {
            "owner_created": true,
            "entities": 122,
            "entity_domains": 40
          },
          "output_tail": [
            "onboarding status: [{\"step\": \"user\", \"done\": false}, {\"step\": \"core_config\", \"done\": false}, {\"step\": \"analytics\", \"done\": false}, {\"step\": \"integration\", \"done\": false}]",
            "POST /api/onboarding/users -> HTTP 200 (auth_code received)",
            "POST /api/onboarding/core_config -> HTTP 200",
            "POST /api/onboarding/analytics -> HTTP 200",
            "POST /api/onboarding/integration -> HTTP 200",
            "onboarding status after: [{\"step\": \"user\", \"done\": true}, {\"step\": \"core_config\", \"done\": true}, {\"step\": \"analytics\", \"done\": true}, {\"step\": \"integration\", \"done\": true}]",
            "config/core/update -> success=True",
            "configuration.yaml before (265 bytes):",
            "",
            "# Loads default set of integrations. Do not remove.",
            "default_config:",
            "",
            "# Load frontend themes from the themes folder",
            "frontend:",
            "  themes: !include_dir_merge_named themes",
            "",
            "automation: !include automations.yaml",
            "script: !include scripts.yaml",
            "scene: !include scenes.yaml",
            "POST /api/services/homeassistant/restart -> HTTP 200",
            "entities after restart: 122",
            "by domain: {\"sensor\": 22, \"media_player\": 8, \"light\": 6, \"update\": 6, \"cover\": 5, \"fan\": 5, \"number\": 5, \"vacuum\": 5, \"lock\": 4, \"text\": 4, \"valve\": 4, \"device_tracker\": 3, \"binary_sensor\": 3, \"camera\": 3, \"climate\": 3, \"humidifier\": 3, \"event\": 2, \"geo_location\": 2, \"air_quality\": 2, \"calendar\": 2, \"remote\": 2, \"siren\": 2, \"switch\": 2, \"water_heater\": 2, \"weather\": 2, \"conversation\": 1, \"zone\": 1, \"person\": 1, \"sun\": 1, \"todo\": 1, \"tts\": 1, \"image_processing\": 1, \"alarm_control_panel\": 1, \"button\": 1, \"date\": 1, \"datetime\": 1, \"notify\": 1, \"select\": 1, \"stt\": 1, \"time\": 1}"
          ],
          "description": "Complete the onboarding through the endpoints the Home Assistant frontend calls (POST /api/onboarding/users, /api/onboarding/core_config, /api/onboarding/analytics, /api/onboarding/integration): create the owner user, finish the steps, then set the name, location, time zone, units and currency over the WebSocket API (config/core/update). Then add the built-in demo integration (`demo:` in configuration.yaml, written through the shared /config volume) and restart Home Assistant through its API (homeassistant.restart). Idle is measured after that: about 120 entities (the demo integration plus Home Assistant's own), no automations, nobody connected."
        }
      ],
      "idle": {
        "per_service": {
          "homeassistant": {
            "samples": 16,
            "mem_mean_mib": 308.76,
            "mem_max_mib": 309.0,
            "cpu_mean_pct": 0.07,
            "cpu_max_pct": 0.38
          }
        },
        "total": {
          "samples": 16,
          "dropped_for_total": 0,
          "mem_mean_mib": 308.76,
          "mem_max_mib": 309.0,
          "cpu_mean_pct": 0.07,
          "cpu_max_pct": 0.38
        },
        "window_seconds": 30.3,
        "series": [
          {
            "t_offset_s": 0.0,
            "total_mem_mib": 308.7,
            "total_cpu_pct": 0.38
          },
          {
            "t_offset_s": 2.0,
            "total_mem_mib": 308.7,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 4.0,
            "total_mem_mib": 308.5,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 6.1,
            "total_mem_mib": 308.5,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 8.1,
            "total_mem_mib": 308.5,
            "total_cpu_pct": 0.01
          },
          {
            "t_offset_s": 10.1,
            "total_mem_mib": 309.0,
            "total_cpu_pct": 0.33
          },
          {
            "t_offset_s": 12.1,
            "total_mem_mib": 309.0,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 14.1,
            "total_mem_mib": 309.0,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 16.1,
            "total_mem_mib": 308.5,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 18.2,
            "total_mem_mib": 308.5,
            "total_cpu_pct": 0.02
          },
          {
            "t_offset_s": 20.2,
            "total_mem_mib": 309.0,
            "total_cpu_pct": 0.16
          },
          {
            "t_offset_s": 22.2,
            "total_mem_mib": 309.0,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 24.2,
            "total_mem_mib": 308.8,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 26.2,
            "total_mem_mib": 308.8,
            "total_cpu_pct": 0.0
          },
          {
            "t_offset_s": 28.3,
            "total_mem_mib": 308.8,
            "total_cpu_pct": 0.01
          },
          {
            "t_offset_s": 30.3,
            "total_mem_mib": 308.8,
            "total_cpu_pct": 0.16
          }
        ],
        "memory_stat": {
          "read_at": "2026-10-21T03:08:41Z",
          "per_service": {
            "homeassistant": {
              "cgroup": "v2",
              "anon_mib": 292.23,
              "file_mib": 43.17,
              "active_file_mib": 0.0,
              "inactive_file_mib": 43.17,
              "shmem_mib": 0.0
            }
          },
          "read_lag_s": 0.0,
          "method": "docker exec <container> cat /sys/fs/cgroup/memory.stat (cgroup v1: /sys/fs/cgroup/memory/memory.stat); MiB; splits what docker stats shows as one number into anon (heap) and file cache; a field that is absent was not printed by the kernel or not readable (see reason)",
          "taken": "right after the idle window"
        }
      },
      "settle": {
        "settled": true,
        "mode": "detected",
        "settle_seconds_used": 121.0,
        "settle_started_after_healthy_s": 19.7,
        "params": {
          "window_seconds": 60,
          "threshold_pct": 2.0,
          "threshold_min_mib": 10.0,
          "min_seconds": 120,
          "max_seconds": 600
        },
        "last_window": {
          "n": 30,
          "mean_mib": 308.63,
          "min_mib": 308.3,
          "max_mib": 309.0,
          "spread_mib": 0.7,
          "threshold_mib": 10.0
        },
        "rechecks": 0,
        "rule": "settled = over the last window_seconds the stack total varied (max - min) by less than max(threshold_pct of the window mean, threshold_min_mib); not before min_seconds, at the latest max_seconds, both counted from the end of the setup steps; the idle window must also be flat and agree with it. If max_seconds passes without settling, settled=false and the idle window is measured anyway."
      },
      "startup_peak": {
        "per_service_mem_mib": {
          "homeassistant": 336.8
        },
        "total_mem_mib": 336.8,
        "samples": 70,
        "note": "highest value across docker stats samples (about one every 2-3 s) from healthy until the stack settled; shorter spikes between samples are not seen"
      },
      "timeline": {
        "step_s": 10,
        "t0": "healthy",
        "offsets_s": [
          10,
          20,
          30,
          40,
          50,
          60,
          70,
          80,
          90,
          100,
          110,
          120,
          130,
          140,
          150,
          160,
          170,
          180
        ],
        "total_mem_mib": [
          234.4,
          308.6,
          308.6,
          308.3,
          308.6,
          308.4,
          308.5,
          308.2,
          308.6,
          308.7,
          308.5,
          308.7,
          308.6,
          308.8,
          308.6,
          308.8,
          308.9,
          308.8
        ],
        "per_service_mem_mib": {
          "homeassistant": [
            234.4,
            308.6,
            308.6,
            308.3,
            308.6,
            308.4,
            308.5,
            308.2,
            308.6,
            308.7,
            308.5,
            308.7,
            308.6,
            308.8,
            308.6,
            308.8,
            308.9,
            308.8
          ]
        }
      },
      "load": {
        "per_service": {
          "homeassistant": {
            "samples": 62,
            "mem_mean_mib": 308.24,
            "mem_max_mib": 309.2,
            "cpu_mean_pct": 1.12,
            "cpu_max_pct": 25.63
          }
        },
        "total": {
          "samples": 62,
          "dropped_for_total": 0,
          "mem_mean_mib": 308.24,
          "mem_max_mib": 309.2,
          "cpu_mean_pct": 1.12,
          "cpu_max_pct": 25.63
        },
        "description": "Eight automations that fire all the time, plus one client. A Python script (standard library only, on the host network) logs in as the owner and creates the automations through the config API the automation editor uses (POST /api/config/automation/config/<id>). Six time_pattern automations (every 2, 3, 4, 5, 6 and 7 seconds) toggle or set the demo lights, switches, fans, a cover, a humidifier and a thermostat (temperatures in degrees F, the lab's unit system), one automation reacts to a light's state change by firing an event, and one writes a persistent notification once a minute. The script then keeps one WebSocket subscription to state_changed events for 120 seconds and counts them, and reads the server's error log at the end to count automation errors (it reports the number; the run expects 0). Every state change and event is written to the recorder's SQLite database. No dashboard is open, no mobile app, no voice, no real devices.",
        "duration_s": 120.2,
        "window": "from LAB_MARK load_start (or step start) until 2 s after the step ended",
        "reported_by_script": {
          "automations": 8,
          "load_seconds": 120.2,
          "state_changed_events": 845,
          "state_changes_per_s": 7.03,
          "entities": 130,
          "automation_errors_in_log": 0
        },
        "output_tail": [
          "create automation lab_switches_toggle_7s -> HTTP 200 {\"result\": \"ok\"}",
          "create automation lab_thermostat_3s -> HTTP 200 {\"result\": \"ok\"}",
          "create automation lab_brightness_4s -> HTTP 200 {\"result\": \"ok\"}",
          "create automation lab_fan_cover_6s -> HTTP 200 {\"result\": \"ok\"}",
          "create automation lab_humidifier_2s -> HTTP 200 {\"result\": \"ok\"}",
          "create automation lab_react_to_light -> HTTP 200 {\"result\": \"ok\"}",
          "create automation lab_notify_60s -> HTTP 200 {\"result\": \"ok\"}",
          "automation entities: 8, states: ['on']",
          "state_changed events in 120 s: 845 (7.0 per second); busiest: [[\"automation.lab_toggle_a_humidifier_every_2_s\", 120], [\"automation.lab_fire_an_event_when_the_bed_light_changes\", 106], [\"automation.lab_random_thermostat_target_every_3_s\", 80], [\"humidifier.humidifier\", 60], [\"automation.lab_random_brightness_every_4_s\", 60]]",
          "automation errors in the error log: 0"
        ],
        "series": [
          {
            "t_offset_s": 0.0,
            "total_mem_mib": 307.2,
            "total_cpu_pct": 0.55
          },
          {
            "t_offset_s": 2.0,
            "total_mem_mib": 306.1,
            "total_cpu_pct": 0.15
          },
          {
            "t_offset_s": 4.0,
            "total_mem_mib": 306.6,
            "total_cpu_pct": 0.89
          },
          {
            "t_offset_s": 6.0,
            "total_mem_mib": 306.8,
            "total_cpu_pct": 1.45
          },
          {
            "t_offset_s": 8.0,
            "total_mem_mib": 307.0,
            "total_cpu_pct": 0.52
          },
          {
            "t_offset_s": 10.0,
            "total_mem_mib": 307.0,
            "total_cpu_pct": 0.52
          },
          {
            "t_offset_s": 12.0,
            "total_mem_mib": 307.2,
            "total_cpu_pct": 0.55
          },
          {
            "t_offset_s": 14.0,
            "total_mem_mib": 307.2,
            "total_cpu_pct": 0.16
          },
          {
            "t_offset_s": 16.0,
            "total_mem_mib": 307.7,
            "total_cpu_pct": 2.59
          },
          {
            "t_offset_s": 18.0,
            "total_mem_mib": 307.3,
            "total_cpu_pct": 0.18
          },
          {
            "t_offset_s": 20.0,
            "total_mem_mib": 307.6,
            "total_cpu_pct": 0.42
          },
          {
            "t_offset_s": 22.0,
            "total_mem_mib": 307.6,
            "total_cpu_pct": 0.46
          },
          {
            "t_offset_s": 24.0,
            "total_mem_mib": 307.6,
            "total_cpu_pct": 0.44
          },
          {
            "t_offset_s": 26.1,
            "total_mem_mib": 307.9,
            "total_cpu_pct": 1.42
          },
          {
            "t_offset_s": 28.1,
            "total_mem_mib": 307.9,
            "total_cpu_pct": 0.84
          },
          {
            "t_offset_s": 30.1,
            "total_mem_mib": 307.9,
            "total_cpu_pct": 0.35
          },
          {
            "t_offset_s": 32.1,
            "total_mem_mib": 308.2,
            "total_cpu_pct": 0.4
          },
          {
            "t_offset_s": 34.1,
            "total_mem_mib": 308.0,
            "total_cpu_pct": 0.54
          },
          {
            "t_offset_s": 36.1,
            "total_mem_mib": 308.0,
            "total_cpu_pct": 1.72
          },
          {
            "t_offset_s": 38.1,
            "total_mem_mib": 308.0,
            "total_cpu_pct": 0.15
          },
          {
            "t_offset_s": 40.1,
            "total_mem_mib": 308.2,
            "total_cpu_pct": 0.76
          },
          {
            "t_offset_s": 42.1,
            "total_mem_mib": 308.4,
            "total_cpu_pct": 0.15
          },
          {
            "t_offset_s": 44.1,
            "total_mem_mib": 308.3,
            "total_cpu_pct": 0.63
          },
          {
            "t_offset_s": 46.1,
            "total_mem_mib": 308.2,
            "total_cpu_pct": 1.87
          },
          {
            "t_offset_s": 48.1,
            "total_mem_mib": 308.1,
            "total_cpu_pct": 0.43
          },
          {
            "t_offset_s": 50.1,
            "total_mem_mib": 308.3,
            "total_cpu_pct": 0.52
          },
          {
            "t_offset_s": 52.1,
            "total_mem_mib": 308.7,
            "total_cpu_pct": 0.75
          },
          {
            "t_offset_s": 54.1,
            "total_mem_mib": 308.4,
            "total_cpu_pct": 0.17
          },
          {
            "t_offset_s": 56.1,
            "total_mem_mib": 308.3,
            "total_cpu_pct": 1.96
          },
          {
            "t_offset_s": 58.1,
            "total_mem_mib": 308.5,
            "total_cpu_pct": 0.77
          },
          {
            "t_offset_s": 60.1,
            "total_mem_mib": 308.4,
            "total_cpu_pct": 0.47
          },
          {
            "t_offset_s": 62.1,
            "total_mem_mib": 308.6,
            "total_cpu_pct": 0.15
          },
          {
            "t_offset_s": 64.1,
            "total_mem_mib": 308.6,
            "total_cpu_pct": 0.78
          },
          {
            "t_offset_s": 66.1,
            "total_mem_mib": 308.5,
            "total_cpu_pct": 1.53
          },
          {
            "t_offset_s": 68.1,
            "total_mem_mib": 308.2,
            "total_cpu_pct": 0.43
          },
          {
            "t_offset_s": 70.1,
            "total_mem_mib": 308.4,
            "total_cpu_pct": 0.44
          },
          {
            "t_offset_s": 72.1,
            "total_mem_mib": 308.3,
            "total_cpu_pct": 0.65
          },
          {
            "t_offset_s": 74.1,
            "total_mem_mib": 308.3,
            "total_cpu_pct": 0.19
          },
          {
            "t_offset_s": 76.2,
            "total_mem_mib": 308.5,
            "total_cpu_pct": 2.79
          },
          {
            "t_offset_s": 78.2,
            "total_mem_mib": 308.5,
            "total_cpu_pct": 0.17
          },
          {
            "t_offset_s": 80.2,
            "total_mem_mib": 308.5,
            "total_cpu_pct": 0.45
          },
          {
            "t_offset_s": 82.2,
            "total_mem_mib": 308.7,
            "total_cpu_pct": 0.48
          },
          {
            "t_offset_s": 84.2,
            "total_mem_mib": 308.7,
            "total_cpu_pct": 0.46
          },
          {
            "t_offset_s": 86.2,
            "total_mem_mib": 309.0,
            "total_cpu_pct": 3.44
          },
          {
            "t_offset_s": 88.2,
            "total_mem_mib": 308.9,
            "total_cpu_pct": 25.63
          },
          {
            "t_offset_s": 90.2,
            "total_mem_mib": 308.9,
            "total_cpu_pct": 0.38
          },
          {
            "t_offset_s": 92.2,
            "total_mem_mib": 308.8,
            "total_cpu_pct": 0.15
          },
          {
            "t_offset_s": 94.2,
            "total_mem_mib": 308.8,
            "total_cpu_pct": 0.48
          },
          {
            "t_offset_s": 96.2,
            "total_mem_mib": 308.9,
            "total_cpu_pct": 1.55
          },
          {
            "t_offset_s": 98.2,
            "total_mem_mib": 308.6,
            "total_cpu_pct": 0.15
          },
          {
            "t_offset_s": 100.2,
            "total_mem_mib": 308.8,
            "total_cpu_pct": 0.7
          },
          {
            "t_offset_s": 102.2,
            "total_mem_mib": 308.9,
            "total_cpu_pct": 0.17
          },
          {
            "t_offset_s": 104.2,
            "total_mem_mib": 308.8,
            "total_cpu_pct": 0.36
          },
          {
            "t_offset_s": 106.2,
            "total_mem_mib": 309.1,
            "total_cpu_pct": 1.88
          },
          {
            "t_offset_s": 108.2,
            "total_mem_mib": 308.6,
            "total_cpu_pct": 0.15
          },
          {
            "t_offset_s": 110.2,
            "total_mem_mib": 308.6,
            "total_cpu_pct": 0.17
          },
          {
            "t_offset_s": 112.2,
            "total_mem_mib": 309.0,
            "total_cpu_pct": 0.51
          },
          {
            "t_offset_s": 114.2,
            "total_mem_mib": 308.9,
            "total_cpu_pct": 0.26
          },
          {
            "t_offset_s": 116.2,
            "total_mem_mib": 308.8,
            "total_cpu_pct": 1.66
          },
          {
            "t_offset_s": 118.2,
            "total_mem_mib": 309.2,
            "total_cpu_pct": 0.37
          },
          {
            "t_offset_s": 120.2,
            "total_mem_mib": 308.7,
            "total_cpu_pct": 0.36
          },
          {
            "t_offset_s": 122.2,
            "total_mem_mib": 309.0,
            "total_cpu_pct": 0.0
          }
        ],
        "series_start_offset_s": 0.4,
        "peak_note": "peak = highest value seen across docker stats samples (about one every 2-3 s); shorter spikes between samples are not seen",
        "peak_memory_stat": {
          "read_at": "2026-10-21T03:10:43Z",
          "per_service": {
            "homeassistant": {
              "cgroup": "v2",
              "anon_mib": 292.21,
              "file_mib": 46.88,
              "active_file_mib": 0.0,
              "inactive_file_mib": 46.88,
              "shmem_mib": 0.0
            }
          },
          "read_lag_s": 0.0,
          "series_index": 59,
          "sample_t_offset_s": 118.2,
          "total_mem_mib": 309.2
        }
      },
      "container_end_state": {
        "homeassistant": {
          "restart_count": 0,
          "oom_killed": false
        }
      },
      "teardown": {
        "done": true,
        "volumes_removed": true,
        "images_removed": false,
        "error": null
      },
      "warnings": [],
      "finished_at": "2026-10-21T03:10:53Z",
      "elapsed_seconds": 306.7
    }
  ],
  "load_defined": true,
  "notes": [
    "Image: the official `ghcr.io/home-assistant/home-assistant`, Home Assistant Container, `privileged: true` and `network_mode: host` as in the docs' compose file. No add-ons (apps) and no Supervisor in this install type. No USB device, Bluetooth, Zigbee or Z-Wave hardware in the lab: those are not tested.",
    "Host networking: the harness health check and steps run in throwaway containers with `--network host`, because the Home Assistant container has no address on the Compose network. localhost in test.yaml is the daemon host (the VPS in remote mode).",
    "Onboarding creates the default integrations google_translate, met (weather), radio_browser and shopping_list, as the first run of the frontend does. The lab host (GitHub Actions runner) has direct internet access. In the earlier sandbox lab a TLS-intercepting proxy made the ones that fetch data log certificate errors (observed 2026-10-07, Home Assistant 2026.9.4); the result still shows what the container idles at.",
    "Adding `demo:` needs a restart (it is a YAML integration). The step waits until Home Assistant reports RUNNING and then restarts it (a restart request during the first seconds, state NOT_RUNNING, is ignored). The restart happens in the setup step, so the startup peak figure includes it.",
    "The load step counts state_changed events with a WebSocket subscription; that client is part of the load."
  ],
  "warnings": [],
  "files": {
    "compose": "home-assistant.compose.yaml",
    "env": null
  },
  "definitions": {
    "memory": "cgroup working set as reported by `docker stats` (usage minus inactive file cache), MiB = 2^20 bytes",
    "cpu": "percent of ONE core as reported by `docker stats` (4 busy cores = 400)",
    "total": "stats over the sum of all containers at the same instant",
    "sample_interval": "docker stats --no-stream takes about 1-2 s per call, so samples are 2-3 s apart",
    "runs": "each run is a full fresh cycle (up, health, setup, settle, idle, load, down -v); the published figure is the median over the runs, shown with the min-max range; see summary.rule"
  }
}
