Build Log
Rick's Today — the daily handoff card
July 3, 2026
Shipped a structured daily check-in card (food/medicine/water/mood) on Rick's portrait page, Council-reviewed for the medical-tracker boundary before building, so Jan stops being the only source of truth for what already happened today.
Timeline
What shipped
dailyCheckins DB table — day-scoped (portraitId, checkinDate) unique index, six soft-signal fields (breakfast/lunch/dinner as not_yet|some|good, medicine as not_yet|done, water as low|some|good, mood as 5 states), free-text notes, updatedBy — schema.ts
New portraitEntries.entryType value 'daily_checkin' — same spine+sidecar shape as behavior_loop/behaviorLoopDetails, so the entry participates in soft-delete and the existing entries table without new columns on the shared table
/api/portraits/[id]/today — GET returns today's checkin (or null) scoped by localDateStr(); POST upserts, creating the entries spine row + detail row on first save of the day, updating the detail row in place on later saves same day. Org-scoped via requireOrgIdApi, same pattern as every other portrait route
RicksTodayCard.tsx — collapsed-by-default card matching GiveMe20Panel/TodayNoteQuickAdd convention, pill-button rows per field, 600ms debounced autosave, 'Saved HH:MM' / 'Couldn't save' status line
Wired above the existing freeform RecentNotesSection/TodayNoteQuickAdd on the portrait page — structured card for the four fields, freeform notes stay for anything else, per Zeb's placement decision
daily_checkin entries excluded from the printed portrait book (memories filter), same treatment as handoff_note and behavior_loop
“The win is not more tracking. The win is fewer moments where Jan has to stop and think, 'Wait... did we already do that?'”