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

correctness bug fixed

new schema fields
3

new schema fields

new server action
1

new server action

semantic button states
2

semantic button states

Timeline

  1. Start

    Day-brief bug fix

    gte(id, itemIds[0]) → inArray — correctness, not polish

  2. 30m

    Schema hardening

    sourceGoogleEventId / sourceRouteItemId / sourceDate added, pushed to Neon

  3. 1h

    addToTodayRoute action

    No googleEventId on copy — write-back structurally impossible

  4. 1.5h

    WeekItemRow UI

    Move to Today vs Add to Today's Route — semantically distinct

  5. 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