Build Log
Steady Me + Give Me 20 Minutes — Jan's Respite Pillars
July 2, 2026
Shipped two real-time caregiver-respite features on Rick's portrait page: an in-the-moment calming button, and a one-shot handoff so Jan can leave the room for a bit — both pressure-tested through the Crucible before building.
Timeline
What shipped
SteadyMePanel.tsx — real-time grounding button on Rick's portrait page: calm/breathing screen, then one suggested phrase + one action pulled only from approved entryEnrichments (what_helps), generic disclosed fallback when nothing approved yet, closing affirmation on both exit paths
GiveMe20Panel.tsx + takeover_sessions DB table + /takeover/[token] public route (no login) — Jan creates a one-shot, time-boxed handoff session (helper name + 10/20/30 min), gets a shareable link, helper sees a takeover card (say/do/avoid/go-get-someone-if), optional 'What worked?' step writes a handoff_note
/api/portraits/[id]/takeover (authed, creates session) and /api/takeover-complete (public, closes session + optional note)
proxy.ts — added /takeover(.*) to public routes
RecentNotesSection.tsx — collapsed the Recent Notes block behind one toggle after 3 rounds of live redesign; quick-add stays always visible, toggle sits top-right aligned with the heading, everything else (suggestions, notes list, See earlier notes, Day history) hides behind it
Fixed a real soft-delete gap found during self-review: the /takeover page's entry query was missing isNull(portraitEntries.deletedAt), which would have let deleted what_helps/what_hurts entries surface on a public no-login card
Fixed broken pronoun/name logic caught during self-review in the takeover card's 'go get someone if' copy and greeting line (session.helperName.split(' ')[0] breaks for free-text names like 'the neighbor')
“ok, good. i kinda liked the show 7 notes / hide better when it was in the top right aligned with the header...”