- Shipped
- September 9, 2026 at 2:32 AM UTC
- Author
- Kamo
- Commit
- 6e9440a
`check-server-timestamps` was red on main: `rememberToday` bucketed the day with `new **************** which is the BROWSER's zone. The guard exists because that is a fact about the machine, not about the member — someone whose profile says Eastern is still working in Eastern from a hotel in Denver. Both cartography eggs that are about WHEN had it: - Twenty Doors counts distinct areas in one sitting. Bucketed by the browser's day, a member two zones from their profile had the set emptied hours early or hours late — mid-sitting either way, and indistinguishable from the egg simply not paying. - Early Bird asked `new Date().getHours() < 6`, the same defect written the other way. It paid for a 7am start and missed a 5am one. `rememberToday` now takes the zone and REQUIRES it, so an omitted one is a compile error rather than a silent fall back to the browser. It buckets with `zonedDayKey`, which the chat day separators and the agenda already group by, so "today" means one thing across the product. `zonedHour` is new beside `zonedDayKey` and is what Early Bird asks now. It uses `hourCycle: 'h23'` rather than `hour12: false`, which renders midnight as 24 in some runtimes and would put an hour outside the range it promises. EggHunter reads `useMemberTimezone()`, which costs nothing: MemberTimezoneProvider wraps the application in the root layout, so this is the zone the server already resolved, available synchronously on the first render. Neither function had a single test, which is why a browser-zone bug survived in both. There are twelve now, including the case that distinguishes them — one instant that falls on different calendar days in Los Angeles and London. The first draft of that test used 09:00 UTC, which is the same day in both and proved nothing; it is 03:00 UTC, inside the only window where the two zones disagree.