Pin DST edges, validate the zone table, and polish the set-clock commit path
- F1: pin the DST engine at the transition window (Madrid 2026 spring
gap + fall overlap, Sydney southern-wrap boundaries, nthWeekdayDom
"last" with no 5th occurrence) and document the deliberate
local-anchored rule-hour approximation in isDstActive. The tests
proved the old gap/overlap docblock sentence inverted: an instant
at/after the rule hour takes the post-transition offset, so the
spring gap resolves via the DST offset and the fall-back ambiguous
hour via the standard offset (second occurrence); the doc now
matches the pinned behavior.
- F2: constexpr-validate every kZones entry via a static_assert sweep
(offset band, fully-zeroed no-DST rules, transition-field ranges,
DST delta 1..120) so a bad table edit fails the build.
- F3: mark setClockCommit [[nodiscard]] and make the button path honor
a rejected commit (stay on the screen, like the keyboard path).
- F4: dedup the "kleidos"/"tz_idx" NVS literals and the read+clamp
logic into kSetClockNvsNamespace/kSetClockTzIdxKey plus one shared,
host-tested setClockStoredZoneIdx() accessor.
- F5: seed the untrusted-clock editor pre-fill from a constexpr
__DATE__ parse (static_assert-pinned parser) instead of the stale
2025-01-01 constant.
- F6: keep Restart last in the Device section, render the settings
clock value as MM-DD HH:MM, and reword SetClockKbdDate to
"date+time" across all five locales (strings_gen regenerated).
Native 1633/1633 (baseline 1626 + 7 new); sticks3/gray/cardputer debug
builds clean under -Werror; variant/conditional guards, doxygen and
pio check green.
Claude-Session: https://claude.ai/code/session_01SV58JXhfxhhc9DC6vdjBo4