ForgeKitFORGEKIT

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.

KnownFeatureEthicsCrucible
1
new DB table (daily_checkins)
1
new entryType (daily_checkin)
3
Crucible council findings addressed pre-build
1
post-build finding patched (silent save failure)

Timeline

Start
Charge received — third leg of the caregiver triangle
Zeb pasted a fully-shaped idea for a daily food/medicine/water/mood card, alongside Steady Me and Give Me 20 Minutes
Early
Crucible Council — architect + qe + steward
Flagged AM/PM medicine slots as reading like a dose log, no verification step, and staleness risk
Mid
Codebase research before shaping
Found the existing entryType + sidecar-detail pattern (behaviorLoopDetails) and the day-unique-index pattern (cardSnapshots) — both reused directly
Build
Schema, API route, component, page wiring
One migration, one route, one component — no new subsystem
Close
Post-build Crucible audit + patch
Fixed a silent-failure gap in the autosave error path before wrap

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?'”

— Zeb, framing the Charge before the Council review