Dev Diary #10
Schema safety nets and service promotion: two agents became proper services with safe migrations and startup probes.
April 22, 2026

Spent the last two days hammering through 84 commits across three repos, mostly life-os. Calendar attendees were serializing as [object Object] instead of actual names—quick fix in the helpers, but it exposed a pattern: we're doing too much serialization at query time instead of picking the right fields upfront. That's the rough edge.
The bigger push was promoting agent-weather and agent-git from side agents to proper services with CONTEXT_REQUEST interfaces. Renamed the database column to process across both—three migration files per service to keep the old state intact during deploy. The schema safety nets I added in those migrations are doing real work now; without them, SQLite provisioning on startup fails silently and you get null columns everywhere.
Wired RS3 inferred activities into the dashboard widget, fixed the email KPI stats to actually show unread/synced counts, and expanded the news roster to 37 sources using a source adapter pattern in agent-news. The news page was crashing because articleIds stayed null—turned out the agent wasn't firing CONTENT_READY payloads with the right event shape.
Mobile layout work across recipes, gym, workout, jobs, football. The gutter token migration is cleaner now; grep-verified zero padding violations on page-container. Removed the grey box from the mobile upcoming fixture card.
Started seeing schema provisioning problems cascade hard. Added a startup probe in shared/rabbitmq/subscriber that hard-fails if the DB schema is missing expected columns—better than silent null returns. Also went through agent-activity, agent-calendar, agent-gym with schemaSafetyNets using PRAGMA table_info instead of IF NOT EXISTS, since older SQLite doesn't like the latter.
The notification service now hard-blocks web-push during sleep hours, pulling timezone config from shared. Per-widget ErrorBoundary on dashboard means one broken fetch doesn't crater the whole page.
What's unresolved: weather data is still stale sometimes—0,0 coordinates getting logged and the 15-min refresh isn't catching it fast enough. Also the activities page infinite reload loop on empty profile needs more investigation. Next is the recipe image URL rendering and activity reschedule mutations.