ForgeKitFORGEKIT

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.

HearthBug FixData ModelCalendarUX
1
correctness bug fixed
3
new schema fields
1
new server action
2
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.

Zeb, session review — on sourceGoogleEventId vs googleEventId