Manual timezone is the single source of local-time truth (task 7e173881) #284
Closed
overseer
wants to merge 3 commits from
task/manual-timezone-authoritative_7e173881-fb99-426f-a2f0-2678439ffc39 into dev
pull from: task/manual-timezone-authoritative_7e173881-fb99-426f-a2f0-2678439ffc39
merge into: :dev
:dev
:main
:task/hacs-brand-icon_ac84fa96-3ff1-41d3-bf03-57eabe0c7574
:task/pwa-icon-from-logo_55e1e687-b0a8-4221-8a84-d2a35dd77b1b
:task/sse-disable-total-timeout_6c4b0fa4-8b7e-4fd0-822c-f93e87d4f2a0
:release/2026-10-06-sse-fix
:task/fix-sse-stream-async-for_4cbf2e96-4102-4358-b0a5-5c2c1bf4b770
:task/document-fa-picker_e2fc2dbc-b25c-4f68-9b11-d6d7c93ed214
:task/fa-searchable-picker_9ca0bc36-01c5-431b-a990-40deea2d8dcf
:task/fa-panel-render_3f21165f-0b68-436a-b2c5-0dba935f6972
:task/full-fa-solid-registry_7c3be300-ced7-4d32-b13e-b9803263df00
:task/document-manual-timezone_e9aa78f3-d762-48ef-ae52-a8db73791b4b
:task/manual-timezone-authoritative_7e173881-fb99-426f-a2f0-2678439ffc39
:task/admin-manual-timezone_ade35bd5-ec58-45a9-aa74-7c14631f94ec
:task/remove-automatic-timezone_7f685179-af49-4a8a-9931-edec86d91904
:task/tasks-show-overdue-before-local-due-time_fd1093b5-e6ae-47e6-aee9-1e8f5ee74e3f
:task/release-review-remediation-timezone_45243478-d697-459b-bdb1-58b48a14b789
:task/time-zone-errors_6351b36d-0eef-4e7d-bf5a-96b754cbc883
:task/return-button_987d2d0f-a5d1-4bb5-a1f3-80fd6adbf5e9
:task/timezone-configured_a0e7649c-58b0-4aa3-91b5-cf426e334a76
:task/admin-timezone_5abc26ed-64e1-4caa-b50a-11100c9be654
:task/delete-task_3efb07b4-7bfa-45af-b36a-57d81249a39d
:feature/916210e7-8736-48da-9136-424731156f8c-ui-bugs
:task/host-today-docs_d2e4f5a6-0000-0000-0000-000000000000
:task/settings-clock-docs_d1ce4976-43a2-4b49-9c1f-6ec2afe1fbea
:task/dst-scheduler_b8f6ac8b-a1c5-4951-8247-ddb799cb3df1
:task/meta-class-nothing_d72dcbc1-d4d2-450e-8059-e75805ee12d0
:task/quest-bugs-overdue-complete_fa7475ba-19ab-49d0-85b6-defaea5a2d3e
:task/ha-logo-update_4bf3c47f-bbd6-46c0-a7d8-0249c5a3af21
:feature/e0855415-bb64-4082-b5ae-c957eaa7307d-expanded-task-icons
:task/legacy-icon-edit_401cffb2-4038-403d-98c8-e5b861bf3a7f
:task/emoji-fecc-parity_8286a894-133f-4582-90fb-88f47eef6628
:task/icon-docs-attribution_a8cb5c40-f28d-4279-bc78-777b73a8ec89
:task/fix-questlog-crest-shield_b9d4c35f-41ad-491e-8000-47dbd3ebd678
:task/fix-questlog-crest-shield-v2_b9d4c35f-41ad-491e-8000-47dbd3ebd678
:task/panel-definition-icon_5e3f3a5a-f963-4519-87af-95046d40a4e3
:task/admin-icon-picker_7c29d925-3ec9-4b04-8bf1-453896f2b4f5
:task/fix-hidden-text-bottom-banner_28ceb0aa-9a07-4baa-9fc3-346588e52843
:task/shared-icon-registry_03ef0bb3-8228-4be6-bb73-ee8bb72c2f0f
:task/namespaced-icon-keys_707994b7-5601-4362-9273-5120edb010c4
:feature/4f6dfe1b-9469-4624-81dc-9f36b4d9c64e-definition-start-date
:task/definition-start-date_457530b6-3325-4bc7-b453-0c021601972d
:feature/802a8515-1841-4521-8969-617de8b5f7ef-create-materializes-instances
:task/create-materializes-instances_36761905-faf3-4c33-b29a-140dca87b09b
:feature/c1f79a07-da1e-4b29-bdb9-946bb33499ce-multiple-presence-patterns
:task/record-multi-pattern-decision_da2dd935-7786-4c75-ab39-861279dc559e
:task/multi-pattern-presence-model_e63a8e64-2f1a-4818-baf2-0d0431bcd014
:feature/24ce7ebf-40cc-432f-976d-f0814b8a375c-admin-pwa-weekstart
:task/calendar-week-starts-sunday_d5e6e19e-e564-4c0c-91e1-0bb6e8b8561e
:feature/24ce7ebf-40cc-432f-976d-f0814b8a375c-admin-pwa-settings
:task/settings-preferences-section_7b0e0002-0000-0000-0000-000000000002
:feature/24ce7ebf-40cc-432f-976d-f0814b8a375c-admin-pwa-followups
:task/manage-children-screen_7b0e0001-0000-0000-0000-000000000001
:feature/000fab07-638e-4f76-a473-afd909d37d8a-admin-pwa-hosting
:task/commit-the-pwa-hosting-artifacts-and-runbook-section_c0de0001-0000-0000-0000-000000000001
:feature/911b11a7-bdbb-4305-86f6-d666e181ed51-api-deployment-and-identity
:task/feature-review-remediation-firewall-unit-pinned-image-deps_f17a0001-0000-0000-0000-000000000001
:task/tested-restore-and-deployment-runbook_6e203451-d21c-4298-8145-13b2d86f4679
:task/continuous-backup-of-the-sqlite-file_47b27ccb-8a6f-4853-bc9a-3ff6bbcb9bf3
:task/reverse-proxy-and-tls-for-the-api_9d121e76-e1ce-479f-aef5-0e5e9756fda8
:feature/24ce7ebf-40cc-432f-976d-f0814b8a375c-admin-pwa
:task/fix-the-admin-auth-probe-path-and-refusal-state_af11a2c1-0000-0000-0000-000000000001
:task/undo-and-live-sse-updates_e57facc2-a4d9-41d9-bb38-4364b57e5eba
:task/csv-export-of-the-filtered-range_e5133d0f-b373-4fcd-b666-6c77dfa49b98
:task/history-tab-filters-rows-stats-footer_9b9188b8-c41e-4002-81dd-1f86b5c19eb9
:task/presence-override-with-live-consequence-count_4ae0c879-2bc3-4aee-a084-5e48b41c2085
:task/presence-schedule-month-grid_d96d8925-7e35-45a8-80f4-3509bd56c4d0
:task/lucide-icon-picker-shipped-subset_b50b048f-40f6-418e-b571-ef6be3796296
:task/recurrence-occurrence-preview_85b2f166-d9da-45b5-928e-3ff4d2cc6d89
:feature/fce8c1f9-3f3a-411e-8f7d-8361f2f886bb-admin-api-completion
:task/admin-transition-sse-stream_92f75680-6d28-4060-bbfc-be808d5c6361
:task/admin-override-consequence-count_7616e3eb-da8b-42cc-8fc7-bbfac2074662
:task/admin-presence-schedule-and-override-reads_07fde892-ddd0-4d8f-a03f-8775e77660e5
:task/admin-rule-occurrence-preview-route_5f843564-8399-4afc-b5f6-023dff146a8d
:task/definitions-list-and-edit-sheet_2e96585c-ca63-413d-bf99-7e203c39ddde
:feature/ec56eee6-a9a4-4c4e-a49b-91d6fb8b9312-definition-assignees
:task/editable-assignees-on-the-admin-definition-edit-route_1c8096f6-643d-441b-a61a-892e0d5b3b59
:feature/ec56eee6-a9a4-4c4e-a49b-91d6fb8b9312-admin-api-completion
:task/persisted-skip_on_away-on-quest-definitions_ded75ab8-0219-4d52-aefa-82c09e0b5e6b
:task/admin-quest-definition-list-route_d4667573-c35b-4eb2-9776-9722c0d74441
:task/today-tab_e0a2b862-8c1e-4d5b-95ad-48b460bfeaa0
:feature/63ee21d7-b495-4823-82ef-e2663d669ddc-admin-today-snapshot-api
:task/admin-snapshot-route-for-the-today-view_ef3f4877-502d-44dc-ba40-367de16fa355
:task/pwa-manifest-and-service-worker_96ab3c0b-7554-4098-8af1-2be7815f8929
:task/authentik-oidc-pkce-login-and-refusal-handling_630c3472-81a4-49bf-bf4c-9837193efa87
:task/react-scaffold-build-and-serve_0df715b5-c094-4cea-a496-ec43775e55b9
:chore/auto-promote-complete-features-20260923
:task/make-the-missed-sweep-watermark-claim-safe-across-processes_a232c4f5-3a09-4c00-bf7c-1476092be01f
:task/containerize-the-api-with-a-persistent-volume_d45cc3d2-fc99-4d8a-a9b0-7b3f55b53261
:feature/3e640c07-2132-46e2-a363-be72ee091291-zero-config-panel-dashboard
:task/auto-discovery-slug-must-match-home-assistants-real-slugify_67775be9-6b0d-4839-bbe1-bb8eaefaa5f4
:task/zero-config-runbook-and-test-updates_fc69c940-e993-4449-8dd8-b0c748dab7d0
:task/transitions-and-animations-to-the-mockups_50067c1f-c807-4d08-8c2a-ee6cb71b6498
:task/navigation-crest-tap-to-child-log-and-idle-return_107b8fbe-2557-4b21-a557-2da8daa3a722
:task/auto-register-the-dashboard-on-setup_c2d4dd8e-96f1-4f67-ab61-4ff370517dee
:task/dashboard-strategy-generating-the-views_c859af23-3156-47c7-a6fd-c4ec1848609b
:task/cards-auto-discover-children_1b6d91d2-7998-48e5-be06-2b4d726ee7b2
:feature/430f7f98-7650-43e9-aa98-4b340303602a-ha-integration-as-api-client
:task/remove-the-integrations-database-migrations-daos-and-business-modules_ad67fc44-f4ff-4538-b6db-946e6d087d57
:task/remove-the-ha-admin-services-and-permission-gate_d04f5bf3-7111-40af-aeb1-1b3199a10102
:task/last-good-snapshot-cache-and-staleness-handling_d25b875f-611b-418a-be2f-3026ef69b26e
:task/complete-quest-proxies-to-the-api_47c7c90e-cbe8-4192-a996-b639834f67b2
:task/sse-subscription-re-fires-the-four-ha-bus-events_b1ed9c45-e317-4ace-9b27-00cf1add739b
:task/coordinator-polls-the-snapshot-and-builds-the-sensors_6e70d166-8384-4be7-9374-bced90bb6598
:task/api-client-module-for-the-integration_37d5e806-8176-4360-a240-5583c50d31ba
:feature/cd03735b-2498-4b34-b84c-c1cb2b271ba7-nestquest-api-service
:task/run-the-missed-sweep-in-the-api-and-publish-quest-missed_058c7b69-d136-4ca4-854b-770fa9fc4b73
:task/admin-routes-settings-read-and-update_2b3de7e5-ea8c-4bbe-8e47-f103242d51b8
:task/admin-routes-history-query-and-csv-export_2d2dda53-55ae-439d-a1d0-7a40ff9671a9
:task/admin-routes-uncomplete-and-regenerate_da0226b3-a504-4db2-8cd8-b4fb07adbdb9
:task/admin-routes-presence-schedule-and-override_e4a9d31b-08a7-4465-b954-180b9e3c8991
:task/admin-routes-quest-definitions_b586a2f1-1532-4194-a19a-8f8386d22590
:task/admin-routes-children_e4845baa-2c2e-4b0a-abea-11afe697c555
:task/admin-auth-nestquest-admins-group-gate-and-service-token-rejection_0f2afb29-1136-4b93-b088-48d451bdbbbe
:task/admin-auth-authentik-jwt-validation_e70e6bfb-085a-4781-a3f4-276355bbbd19
:task/sse-publish-uncompleted-child-day-complete-and-missed_44c93cfd-79f8-4d47-a807-e9b8613992f1
:task/sse-endpoint-and-the-quest-completed-transition_4d7bae00-c930-4124-8d8e-36db7a96a0a7
:task/panel-plane-complete-route-idempotent_1860ef76-e936-4d4f-a150-1cf7b721f519
:task/panel-plane-service-token-auth-and-snapshot-route_ae7e90ae-84a5-49b6-9381-fb5e9e797cce
:chore/nq-foreground-orchestrator-20260922
:chore/nq-manual-cycle-20260922
:chore/nestquest-orchestrator-control-20260922
:task/extract-the-panel-snapshot-builder-into-core_9047a97b-b568-4f11-9422-5e6eb6898ec5
:task/fastapi-skeleton-health-openapi-core-wiring_042dfc5c-9082-4db9-9539-790cd21f5308
:feature/a9513378-856c-4ced-8722-c99850d3a524-domain-core-extraction
:task/no-ha-end-to-end-smoke-test_628473ad-85e5-4b6c-9072-05b3d7870bf1
:task/replace-ha-config-reads-with-a-settings-object_4dd8f870-9175-44f8-9db6-6b048546d0de
:task/extract-engines-and-business-layer-into-core_510c1f78-2bfd-46be-adb7-50d1bb0de326
:task/extract-storage-layer-into-core_d0b691d8-b061-4cd7-ba26-5e170c8e13cb
:fix/sensor-device-class-percentage
:feature/4bf51bbd-33d9-45c7-8815-b05a1ef052b3-kid-panel-lovelace-card
:task/touchhub-setup-runbook_afdf9f27-c885-4f58-8b7b-9ae43aadc2c3
:task/panel-card-tests-no-admin-controls_33306152-e5de-4dff-ab58-b979f6abc29f
:task/fit-and-verify-panel-layout-1920x1080_dceefeca-398c-41c7-a138-7ced3762257e
:task/live-sensor-event-subscription_1caa1b1d-b0f2-491f-b444-78888a218c39
:task/quest-complete-screen-1c_da99072a-de5d-439d-9e05-d3b65ee6c169
:task/complete-confirm-1j-complete-quest-optimistic-seal_e592022e-a832-4aa8-a200-7e313b7aaf7c
:task/define-and-implement-panel-empty-and-error-states_579110fe-6e95-403a-a4ad-d587230d62f9
:task/quest-log-card-1b-read-only_974f819c-3dd5-48f1-b625-b1b4d9b866a0
:task/party-board-card-1a-read-only_e9ce5357-b93b-4110-9610-545e695667f5
:task/frontend-groundwork-www-fonts-tokens-card-registration_77289ff3-d143-4d7d-9f9a-a845b02c1a65
:task/lit-build-toolchain-and-auto-registered-lovelace-resource_906b5ede-fafc-4c40-aace-8a19b67f984d
:feature/8c98e112-d997-424a-9de9-49cc282525f8-progress-automations-notifications
:task/document-the-automation-package-and-test-blueprint-validity_169cd7c7-1d47-4e3e-a970-80c805f0068f
:task/day-complete-celebration-blueprint_dfe4edc2-4174-4946-8b88-6f8133180986
:task/end-of-day-parent-report-blueprint_063108d2-42e1-4793-8e16-e6914e66b5a3
:task/afternoon-open-quests-reminder-blueprint_bceedae1-22bb-4985-85c9-9cec8752ded8
:task/morning-summary-blueprint_471f061d-ff53-44e6-aea1-1dfc39e2715b
:task/add-notification-configuration-to-the-options-flow_0851eee6-b230-4c80-8d55-db752024c840
:task/nightly-missed-quest-sweep-job_93129a74-cbcd-47d8-aae4-1a2341275dcc
:feature/5841198a-cca2-4268-88e5-96a551a03609-entity-event-surface
:task/tests-for-entities-and-bus-events_7aa407de-dc97-44e2-a9a1-c01a1324b495
:task/handle-entity-lifecycle-for-added-deactivated-and-reactivated-children_1a3a783f-93cb-4c53-bc11-6b5f95e5c4f5
:task/push-immediate-entity-updates-on-completion_aa5d615a-1beb-42c7-a1a6-0f165cd9b54b
:task/fire-the-bus-events-with-documented-payloads_9b4f89fd-7f9a-4888-8606-c1c2eab24fd7
:task/household-rollup-and-cycle-day-sensors_0f85dc10-365a-4407-8643-4c465743d4ec
:task/per-child-all-done-and-present-today-binary-sensors_57f21f59-bc3a-4e74-baea-9f54e3cf3601
:task/per-child-next-quest-due-sensor-with-attributes_62ee3730-3855-4492-9943-6ef5bc9192a0
:task/per-child-daily-count-and-percentage-sensors_e8a70a61-c28f-4064-96d4-f599a4adbf96
:task/build-the-shared-dataupdatecoordinator_be0010e2-a504-4b40-87ee-053d70d947b8
:feature/e2ac03c0-f830-42bd-ab05-fc727ae8352c-permission-enforcement
:task/permission-test-matrix-across-every-registered-service_dbe9259d-2243-4b47-8d72-5cc38e7e81e2
:task/log-denied-and-successful-admin-only-calls_8b870368-264a-4bc3-9c28-a4c161bed210
:task/fail-closed-when-no-user-context_8a3deedc-9350-43be-bd98-bc3cd39fba31
:task/implement-permission-decorator_d17696e6-763b-41e7-a8d4-c621a52a7f7b
:task/define-admin-only-versus-open-operation-registry_e3da52cb-3f4f-47e6-b17c-f77d2078dcf1
:task/register-canonical-nestquest-ha-services_e032ebb8-84f7-4439-97d9-4294367a50c8
:feature/a526b715-1fd2-4688-9696-a7eeb45f1644-quest-completion-event-log
:task/completion-lifecycle-tests_9cad8f81
:task/derive-missed-state_12eee79f
:task/was-on-time-at-completion_92748f9b
:task/uncomplete-instance_62ba2319
:task/complete-instance_1775b4aa
:task/instance-state-from-latest-event_32b50fbe
:task/completion-business-layer_8c814a3d
:feature/4a35e972-4c72-405d-8331-ce0776176784-quest-instance-materialization
:task/guard-stale-due-time_f1ce072c
:task/thread-horizon-days_2d3c0792
:task/end-to-end-generation_a3e67b25
:task/no-past-instances_ba5fd5f0
:task/ha-local-timezone_0d4d37de
:task/startup-backfill-service_95cbead8
:task/schedule-daily-run_3614e2ab
:task/regenerate-for-child_f8d5c346
:task/regenerate-for-definition_a0b8b5f7
:task/skip-completed-instances_de5e8223
:task/materialize-idempotency_d6a47fcb
:task/core-materialize-walk_fde0d4f5
:feature/b61a578c-2139-486e-af46-77303a185386-quest-definitions-assignment
:task/f06-integration-fixes_8c5cb85e
:task/quest-definition-tests_b55cdd5f
:task/quest-definition-query-helpers_d1492847
:task/deactivate-reactivate-definition_8668303a
:task/assign-unassign-children_696b9b35
:task/edit-quest-definition_b2175f99
:task/create-quest-definition_707f724c
:task/map-schedule-rule-storage_6d2a7581
:feature/167e3565-704d-41c7-adf6-3b88ed266f78-presence-custody-schedules
:task/5841f120-parity-regression
:task/7f0190c4-present-preview
:task/6a1e14aa-override-precedence
:task/46a867a4-override-overlap
:task/5059d16c-is-present
:task/06cc4782-cycle-arithmetic
:task/ede1dc76-presence-model
:feature/4f802471-1de1-4c35-844f-eebf3bea0de5-children-registry-admin-allowlist
:task/3f2eb268-is-admin-resolver
:task/288a953c-admin-allowlist
:task/31e80e1a-child-reorder
:task/35e97242-child-deactivate
:task/90a3a7a3-child-profiles
:feature/c16267ae-75be-4a4e-b14f-e41c06c8ab11-design-model-changes
:task/d77a9756-actor-child-id
:task/26762cd6-quest-instance-key
:task/c2a8597a-quest-windows
:task/5cc267f6-quest-assignees
:task/dfd0b9a9-quest-rename
:task/final-sync
:task/release-sync-04
:task/merge-f04-dev
:feature/ff8e0866-061f-411f-9de7-1728754ca01d-recurrence-rule-engine
:task/59087981-consolidated-calendar
:task/47b1bc60-occurrences-property
:task/776a046f-window-bounds
:task/2eb952f9-yearly-recurrence
:task/372882e7-monthly-weekday-recurrence
:task/01445d72-monthly-day-recurrence
:task/dd5c8c60-weekly-custom-recurrence
:task/6b5e012d-daily-recurrence
:task/66c097de-rule-model
:feature/8940567d-7b50-41ef-a510-8b234fe7290e-sqlite-data-layer
:task/2e147f1b-dao-test-suite
:task/d5bca74b-corrupt-db-startup
:task/a9ea75fc-dao-instances-events
:task/e5c9c4ad-dao-presence
:task/8c72300c-dao-rules-definitions
:task/4ce39f1a-dao-children-admins
:task/06782a75-migration-runner
:task/b8c54d04-schema-instances-events
:task/efcf1ae7-schema-presence
:task/2a317bcb-schema-rules-definitions
:task/98af7b2d-schema-children-admins
:task/745afd2a-async-sqlite-wrapper
:release-fix/rls-docs-sweep
:feature/58fafd51-67e5-4691-8b37-cf0bb545207c-integration-scaffold
:task/231563a9-de43-4c67-8ca5-b2659760d9b2-pytest-harness
:task/056f8ba7-71ce-415e-a1cc-a93a9ec4b37e-options-flow
:task/50c24cf4-de4c-4455-9e1b-217eccf6fef9-sqlite-path-helper
:task/899d914f-b700-4e35-93e2-b8a33190246a-setup-lifecycle
:task/b1a42fd5-1911-4ee5-97ba-d4ab9da9d918-hacs-metadata-and-docs
:task/d34d0887-57bf-49be-bf6a-26b0bc1f85d3-ui-config-flow
:task/335bb71c-82a8-49d7-aa28-b2fde84f14fb-define-shared-constants
:task/218b8bb8-963b-41d9-be60-77bfec8c5f04-package-structure-and-manifest
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Maestro task:
7e173881-fb99-426f-a2f0-2678439ffc39(feature a3cd8e27, Manual application timezone control).Done-condition: the timezone the admin saves decides local time across the whole application, the kids' panel included. The browser's clock never decides overdue, and an admin save re-plans the missed-sweep scheduler.
A. The panel follows the application timezone
frontend/src/cards/quest-log.ts: restoresPanelInstance.overdueand renders the API snapshot'soverdueflag, which the API computes in the stored zone. This removes the browser-local_isOverdue/wallClockMinutescheck added by task fd1093b5.tests/test_panel_cards.py:test_quest_log_overdue_follows_the_api_snapshot_not_the_panel_clock.B. The scheduler honours the real admin writer
api/routes_admin.admin_update_settingsholdssweep_scheduler.settings_lockacrossupdate_settings, then callssettings_changed(settings).test_admin_settings_patch_replans_a_sleeping_scheduler, with one case fortimezoneand one forday_rollover_time.C. Authority across surfaces
_household_clock→settings.household_now, and so does the scheduler. An emptytimezonemeans API-host local time, and nothing auto-fills it.test_admin_saved_zone_is_authoritative_across_surfaces(Asia/Kolkata).D. The visible date and clock follow the application zone (TZ-001, commit
bb748c3)timezone. The integration passes it through, and the household due-today sensor publishes it as an attribute. Both cards'_timeZone()format the date and clock in it.admin/src/time/AppTimezone.tsx) and uses it for the Today completion clock, History grouping, clocks, lateness and "today", Schedule "today", and new-task default dates. Saving in Settings applies it app-wide straight away.E. One effective zone for an empty setting (TZ-002, commit
e48a058)api/host_zone.py.effective_timezone(stored)returns the stored zone, or else the API host's own IANA zone. The host zone is resolved the way the C library does it:TZ, then the/etc/localtimezoneinfo link, then/etc/timezone, and UTC when none of these is configured. It returns""only when the host zone has no IANA name.timezoneis now this effective zone.GETandPATCH /api/v1/admin/settingsadd a read-onlyeffective_timezone. The storedtimezoneis unchanged, so the picker still shows "API host local time (no zone set)".AppTimezoneProviderand Settings publisheffective_timezone. The browser zone applies only if the API publishes none.timezone. Home Assistant's zone now applies only when the rollup has no zone at all (an older API). The comments are updated and the bundle is rebuilt.test_empty_zone_publishes_the_api_host_zone_to_panel_and_admin: the host is Pacific/Auckland and the clock is 12:30Z. The paneltimezoneand the admineffective_timezoneare both Pacific/Auckland, andtoday_isois 2026-09-27, the date the published zone gives. After a zone is saved, both report the saved zone.tests/test_api_host_zone.py: resolver unit tests using temporary/etctrees.effective_timezone.F. An older API payload keeps working (TZ-003, commit
e48a058)coordinator.snapshot_from_api_payloadnow readspayload.get("timezone", "").test_coordinator_reads_a_legacy_payload_without_timezoneuses the exact pre-change fixture payload. The refresh succeeds andsnapshot.timezone == "".Checks (head
e48a058)TZ=UTC uv run pytest -q→ 2195 passedcd admin && npm test→ 339 passed (17 files).npm run buildsucceeds.cd frontend && npm run build→ bundle rebuilt and committed.bb748c3, in a throwaway worktree (now removed):api/host_zone.pyadded so the tests can import, 16 Python tests fail. They are the settings and snapshot tests expectingeffective_timezone, the empty-zone consistency test (KeyError: 'effective_timezone'), and the legacy-payload test (last_update_successis False).🤖 Generated with Claude Code
The panel snapshot now carries the admin-saved `timezone` ("" when unset); the coordinator threads it onto the household due-today sensor, and the Party Board and Quest Log cards format their kicker, header and dock date and clock in it, falling back to Home Assistant's zone only when none is stored. The admin app loads the stored zone once (AppTimezoneProvider) and uses it for completion clocks, History day grouping, clocks and lateness, and "today" in Schedule, History and new task defaults; Settings publishes a saved zone app-wide at once. Resolves review finding TZ-001 (task 7e173881). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>Pull request closed