Summary
UpdateHouseholdInput.timezone is z.string() with no IANA check. The stored value feeds SchedulerDO.scheduleFromSource(…, timezone, …); Intl.DateTimeFormat(…,{timeZone:"Mars/Olympus"}) throws RangeError, so one bad admin submit breaks alarm computation for every source.
Evidence
packages/data-ops/src/zod-schema/household.ts:11-13 — timezone: z.string().
apps/user-application/src/core/functions/household-settings.ts:21-31 — stores it as-is.
apps/data-service/src/domain/waste-collection-handler.ts:67-94 / birthday-handler.ts:19-46 — Intl.DateTimeFormat({timeZone}) throws on an invalid zone.
Proposed failing test (TDD)
packages/data-ops/src/zod-schema/household.test.ts — "rejects a non-IANA timezone": UpdateHouseholdInput.safeParse({timezone:"Not/AZone"}) → success === false. Currently true.
Fix direction
.refine(tz => Intl.supportedValuesOf("timeZone").includes(tz)).
Summary
UpdateHouseholdInput.timezoneisz.string()with no IANA check. The stored value feedsSchedulerDO.scheduleFromSource(…, timezone, …);Intl.DateTimeFormat(…,{timeZone:"Mars/Olympus"})throwsRangeError, so one bad admin submit breaks alarm computation for every source.Evidence
packages/data-ops/src/zod-schema/household.ts:11-13—timezone: z.string().apps/user-application/src/core/functions/household-settings.ts:21-31— stores it as-is.apps/data-service/src/domain/waste-collection-handler.ts:67-94/birthday-handler.ts:19-46—Intl.DateTimeFormat({timeZone})throws on an invalid zone.Proposed failing test (TDD)
packages/data-ops/src/zod-schema/household.test.ts—"rejects a non-IANA timezone":UpdateHouseholdInput.safeParse({timezone:"Not/AZone"})→success === false. Currently true.Fix direction
.refine(tz => Intl.supportedValuesOf("timeZone").includes(tz)).