Build Log
Hearth: Week-to-Today Loop
June 22, 2026
Bug fix, semantic data model split, and a trustworthy Add to Today's Route — the loop closes without calendar poltergeist.
Timeline
What shipped
Fixed day-brief POST: gte(routeItems.id, itemIds[0]) → inArray(routeItems.id, itemIds) — was fetching every item alphabetically after the first ID in the batch
Schema: sourceGoogleEventId, sourceRouteItemId, sourceDate columns on routeItems — semantically separates 'live calendar item' from 'Hearth reminder created from calendar item'
addToTodayRoute server action: creates today reminder without googleEventId or calendarId — move/edit write-back guards gate on those fields, so Google write-back is structurally impossible on copied items
WeekItemRow: 'Add to Today's Route' for Google Calendar events (no reschedule), 'Move to Today' for normal route items — two buttons, two honest meanings
WeekItemRow: duplicate guard via isOnTodayRoute prop from server — 'On Today's Route' shows on first paint without a click
Week page: todaySourceIds query in Promise.all fetches sourceRouteItemId values for all today's copied items; onTodayRouteIds Set passed into renderItem
Handoff AI prompt: 'ForgeHome Handoff Game' → 'Hearth Handoff Game'
“The data model stopped wearing a fake mustache.”