Re-opened under the dev_agent identity (the previous PR was authored by the owner account via the tea CLI, which was wrong). Same branch/commits as before. Owner requirement: the admin-saved application timezone is the single source of local-time truth for the whole application. Scope: panel overdue + panel/admin date/clock follow the stored zone; admin settings save re-plans the sweep scheduler; empty = API host local consistently; tolerate an older API snapshot payload.
Re-opened under the dev_agent identity (the previous PR was authored by the owner account via the tea CLI, which was wrong). Same branch/commits as before. Owner requirement: the admin-saved application timezone is the single source of local-time truth for the whole application. Scope: panel overdue + panel/admin date/clock follow the stored zone; admin settings save re-plans the sweep scheduler; empty = API host local consistently; tolerate an older API snapshot payload.
The kids' Quest Log again renders each instance's overdue state from
the API snapshot's `overdue` flag, which the API computes in the stored
application timezone. The browser-local overdue check from task
fd1093b5 (`_isOverdue` against `_now`) is removed; `_now` only drives
the header clock and date.
The admin settings route (PATCH /api/v1/admin/settings), the only
settings writer, now holds the missed-sweep scheduler's settings_lock
across the write and calls settings_changed, so saving `timezone` or
`day_rollover_time` re-plans a sleeping scheduler (review finding
TZ-001). An app without a scheduler just writes.
Tests: the card shows the snapshot's overdue state whatever the
browser's zone or clock says; an admin PATCH of the zone or the
rollover re-plans a sleeping scheduler; one saved zone
(Asia/Kolkata) is read identically by the panel snapshot, the admin
snapshot and the scheduler delay.
Task: 7e173881-fb99-426f-a2f0-2678439ffc39
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
TZ-002: with no zone stored the API reads its clock in the host's local
time, but the panel fell back to Home Assistant's zone and the admin app
to the browser's, so dates could disagree near midnight. The API now
names the zone it actually uses (api/host_zone.py: the stored zone, else
the host's own IANA zone from TZ, /etc/localtime or /etc/timezone) and
publishes it as the panel snapshot's `timezone` and the admin settings'
read-only `effective_timezone`. Both cards and the admin app format in
that one zone; Home Assistant's or the browser's zone applies only when
none is published.
TZ-003: snapshot_from_api_payload reads `timezone` with a "" default, so
an integration upgraded ahead of its API keeps refreshing against the
pre-change payload.
Task 7e173881-fb99-426f-a2f0-2678439ffc39
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
overseer
force-pushed task/manual-timezone-authoritative_7e173881-fb99-426f-a2f0-2678439ffc39 from e48a0583c5 to 474c84bf352026-09-30 09:50:28 -04:00Compare
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.
Re-opened under the dev_agent identity (the previous PR was authored by the owner account via the tea CLI, which was wrong). Same branch/commits as before. Owner requirement: the admin-saved application timezone is the single source of local-time truth for the whole application. Scope: panel overdue + panel/admin date/clock follow the stored zone; admin settings save re-plans the sweep scheduler; empty = API host local consistently; tolerate an older API snapshot payload.
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>e48a0583c5to474c84bf35Independent Codex gpt-5.6-terra review completed for this exact commit.