Build Log · June 22, 2026
Hearth: Week-to-Today Loop
Bug fix, semantic data model split, and a trustworthy Add to Today's Route — the loop closes without calendar poltergeist.
- Hearth
- Bug Fix
- Data Model
- Calendar
- UX
- correctness bug fixed
- 1
- new schema fields
- 3
- new server action
- 1
- semantic button states
- 2
correctness bug fixed
new schema fields
new server action
semantic button states
Timeline
Start
Day-brief bug fix
gte(id, itemIds[0]) → inArray — correctness, not polish
30m
Schema hardening
sourceGoogleEventId / sourceRouteItemId / sourceDate added, pushed to Neon
1h
addToTodayRoute action
No googleEventId on copy — write-back structurally impossible
1.5h
WeekItemRow UI
Move to Today vs Add to Today's Route — semantically distinct
2h
isOnTodayRoute on paint
Week page fetches source refs; button correct on first render
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.”