Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5.6 KiB
5.6 KiB
phase, plan, subsystem, tags, requires, provides, affects, tech-stack, key-files, key-decisions, patterns-established, requirements-completed, duration, completed
| phase | plan | subsystem | tags | requires | provides | affects | tech-stack | key-files | key-decisions | patterns-established | requirements-completed | duration | completed | ||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 18-auto-timezone-detection-and-ability-to-change-timezone | 01 | api |
|
|
|
|
|
|
|
|
|
2min | 2026-06-15 |
Phase 18 Plan 01: Household Timezone Accessor + IANA Validator Summary
Single D-05 accessor getHouseholdTimezone(db) reads household_timezone from app_config with D-06 fallback chain; isValidIanaTimezone(tz) validates via Intl.DateTimeFormat try/catch (not supportedValuesOf)
Performance
- Duration: 2 min
- Started: 2026-06-15T02:04:31Z
- Completed: 2026-06-15T02:06:50Z
- Tasks: 2 (TDD RED + GREEN)
- Files modified: 2
Accomplishments
- Created
apps/api/src/lib/householdTimezone.tsexportinggetHouseholdTimezoneandisValidIanaTimezone - 11 unit tests cover all 6 required behaviors: stored row, no-row + TZ env, no-row + no-TZ, null row, valid zones, invalid zones
- D-06 fallback chain
row?.value ?? process.env.TZ ?? Intl.DateTimeFormat().resolvedOptions().timeZonereproduced verbatim - TypeScript typecheck (
tsc --noEmit) clean; full 358-test suite green with no regressions - TDD gate compliance: RED commit (
db0077c) precedes GREEN commit (eaceff0)
Task Commits
- Task 1: RED — failing unit tests -
db0077c(test) - Task 2: GREEN — implement accessor + validator -
eaceff0(feat)
Plan metadata: (see final docs commit below)
Files Created/Modified
apps/api/src/lib/householdTimezone.ts— D-05 accessor + IANA validator, exported for broker + admin route consumersapps/api/tests/lib/householdTimezone.test.ts— 11 unit tests for fallback chain and validator
Decisions Made
isValidIanaTimezoneusesIntl.DateTimeFormat(undefined, { timeZone: tz })try/catch —Intl.supportedValuesOf('timeZone')was explicitly avoided because it omits'UTC'in some environments (RESEARCH Pitfall 2).- Fallback chain matches the verbatim expression found at
reminderScheduler.ts:247so the all-day reminder path continues to work unchanged before Plan 02 seeds a stored value. dbis accepted as a parameter (not imported fromdb/client.js) to enable clean mock-based unit testing without a live MariaDB connection.
Deviations from Plan
None — plan executed exactly as written.
Issues Encountered
- The vitest global setup requires a MariaDB connection (
global-setup.ts). Tests need to be run withDB_HOST=127.0.0.1when running locally (the.envsetsDB_HOST=mariadbfor Docker networking). This is a known dev environment pattern documented infamilysync-dev-stack-setup.mdand has no effect on CI (which uses the service container).
Known Stubs
None — this plan creates a pure utility module with no UI stubs or placeholder data.
Threat Flags
None — no new network endpoints, auth paths, file access patterns, or schema changes were introduced. The accessor is a read-only DB lookup within the trusted server process (T-18-01 disposition: accept).
TDD Gate Compliance
- RED gate:
db0077c—test(18-01): add failing tests for household timezone accessor + IANA validator - GREEN gate:
eaceff0—feat(18-01): implement household timezone accessor + IANA validator - REFACTOR gate: N/A (implementation was clean on first pass)
Next Phase Readiness
getHouseholdTimezoneandisValidIanaTimezoneare the foundation both Plan 18-02 (broker rewire) and Plan 18-03 (admin API + Zod refine) consume.- Plan 18-02 can import
getHouseholdTimezonefrom../lib/householdTimezone.jsto replace the bareprocess.env.TZ ?? Intl…lookups inreminderScheduler.ts:247andoutboxWorker.ts:501,607. - Plan 18-03 can import
isValidIanaTimezonefor the Zod.refine()onPUT /api/admin/config/timezone.
Self-Check: PASSED
apps/api/src/lib/householdTimezone.ts— FOUNDapps/api/tests/lib/householdTimezone.test.ts— FOUND- Commit
db0077c— FOUND - Commit
eaceff0— FOUND
Phase: 18-auto-timezone-detection-and-ability-to-change-timezone Completed: 2026-06-15