# Phase 18: Auto timezone detection and ability to change timezone - Discussion Log

> **Audit trail only.** Do not use as input to planning, research, or execution agents.
> Decisions are captured in CONTEXT.md — this log preserves the alternatives considered.

**Date:** 2026-06-14
**Phase:** 18-auto-timezone-detection-and-ability-to-change-timezone
**Areas discussed:** Timezone scope, Detection & drift, Where to change it, Behavioral boundary

---

## Timezone scope

| Option | Description | Selected |
|--------|-------------|----------|
| Single household tz | One value in app_config; matches existing implicit single-TZ model and the 2-person same-household reality | ✓ |
| Per-member timezone | users.timezone column; per-member 9 AM reminders; needs migration + per-row scheduler logic | |

**User's choice:** Single household tz (app_config)
**Notes:** Two-person same household — single value is the simplest correct model.

---

## Detection & drift

| Option | Description | Selected |
|--------|-------------|----------|
| Seed on setup, manual after | Auto-detect during Phase 12 wizard/first run to seed; thereafter changes only via settings UI, no auto-overwrite | ✓ |
| Detect every login, prompt on drift | Compare browser tz to stored on each login; prompt to update when different | |
| Detect every login, silent update | Always overwrite stored tz with the browser's | |

**User's choice:** Seed on setup, manual after
**Notes:** Avoids travel/VPN silently shifting the "fires at 9 AM" guarantee.

---

## Where to change it

| Option | Description | Selected |
|--------|-------------|----------|
| Admin Settings + wizard | Role-gated /admin Settings (Phase 10) + seeded by the Phase 12 setup wizard | ✓ |
| Any member, general settings | Non-admin settings area; fits per-member scope better | |

**User's choice:** Admin Settings + wizard
**Notes:** Single household-wide setting behind requireAdmin is the correct fit.

---

## Behavioral boundary

| Option | Description | Selected |
|--------|-------------|----------|
| All-day reminder tz only | Stored tz is source of truth for server-side all-day 9 AM computation, overriding process.env.TZ; display + timed serialization stay browser-local | ✓ |
| Also override display / timed logic | Stored tz also drives display rendering and/or timed reminders | |

**User's choice:** All-day reminder tz only
**Notes:** Keeps blast radius small; protects the already-correct browser-local write/display path.

---

## Claude's Discretion

- Timezone picker UX (recorded default: searchable IANA dropdown; validate IANA before storing).
- Exact app_config key name + read/cache strategy for the stored value in scheduler/outbox.
- Optional non-blocking "detected zone differs" login notice (allowed, not required).

## Deferred Ideas

- Per-member timezones — only relevant if members live in different zones; own phase if ever true.
- Driving display/timed reminders off the stored tz — deliberately excluded to protect the browser-local path.
