Thoughts

3 thoughts of type "observation" about "software development" in the last 30 days

Open Brain Session 9 retro: Massive build session. Went from 4 MCP tools to 16 in one session. Built all three extensions (Client Context, Content Pipeline, Business Operations) plus cross-extension intelligence (full_context tool + digest v2). Built and deployed Next.js dashboard to Railway (6 pages, dark theme, password auth). Key learnings: (1) Next.js Supabase client must use lazy init, not module-scope, or Railway builds fail without env vars. (2) Railway CLI is more reliable than Railway MCP for project creation. (3) sed find-replace misses multiline method chains, always check end-of-line patterns separately. (4) Supabase free tier Realtime quota spike was from Dashboard Table Editor tabs, not application code. (5) brain-digest extension context is wrapped in try/catch so empty extension tables never block delivery. Session touched 4 migrations, 12 new tools, 1 full web app, 1 digest upgrade.

Open Brain Session 9 continued: Built Content Pipeline extension (content_items table, 4 tools: log_content, update_content, content_status, content_performance) and Business Operations extension (business_events table, 3 tools: log_event, upcoming_events, business_context). open-brain-mcp now v9 with 15 total tools across 4 core + 3 extensions. business_context is the first cross-extension aggregation tool. File is 1189 lines, above 800-line split threshold but manageable. All tested and deployed.

Tat-Tally: Polling fallback added to display and MC apps for Realtime resilience (2026-03-16) Problem: The display app (public leaderboard monitors) and MC control panel had zero polling fallback. They relied entirely on Supabase Realtime WebSocket subscriptions. Stress testing showed a 1-2% missed event rate, which means over a multi-hour convention, displays could freeze on stale data with no self-recovery. The entrant portal already had refetchInterval: 15_000, but the display and MC apps did not. What failure looks like without the fix: Public monitors behind the judges freeze. Judges keep scoring on iPads, MC keeps calling entries, but the big screens stop updating. Nobody sees new scores until someone manually refreshes the browser. At a convention with 300+ people watching, this kills the transparency promise. Fix: Added refetchInterval to all mission-critical useQuery calls across 4 files. Realtime still handles 98%+ of updates instantly. The poll is just a safety net. Files changed: - src/display/src/pages/master-leaderboard.tsx (leaderboard + current entry, 15s) - src/display/src/pages/active-category.tsx (leaderboard + current entry, 15s) - src/display/src/pages/judge-monitor.tsx (active assignment + current entry, 15s) - src/mc/src/pages/control-panel.tsx (queue 15s, live scores 10s) Static/config queries (event info, display config, criteria, judge assignments) were left without polling since they don't change during active judging. Committed as 00d91aa, pushed to main.