Skip to main content
Paul Welty, PhD AI, WORK, AND STAYING HUMAN

Dinly — 2026-03-24

What shipped

The biggest single day of Dinly development: 16 PRs merged, 45 new tests written, and the entire open issue queue cleared to zero.

The session started by completing the dashboard redesign initiative (#208). The auto-create weekly cycles feature (#207) shipped as two PRs — a getOrCreateUpcomingCycle helper with getCurrentWeekStartDate in the cadence library, then dashboard integration that removes the empty “Start a new week” state. Cooks now always see “This week” and “Next week” cards automatically. On top of that, three more dashboard features landed: a prominent “Tonight’s dinner” card showing what’s for dinner with a link to the recipe, a day-by-day meal list for the current week with past days checked off and today highlighted, and a “Rate it” link connecting to the existing feedback system. The dashboard now answers “what’s for dinner tonight?” at a glance — the core user need Paul identified during browser testing on Mar 23.

A comprehensive codebase scout ran 6 parallel agents (error handling, dead code, test coverage, UX gaps, performance, feature gaps) and surfaced 5 issues. All were executed: vote page queries parallelized from 8 sequential to 2 batched Promise.all calls, admin households N+1 query fixed (3N → 3 queries), error feedback added to 4 forms (pantry, shopping list, settings, new week) with optimistic rollback on the shopping list, and the entire codebase’s hardcoded dark-theme colors replaced — 81 occurrences across 26 files converted to light+dark variants using the dark: prefix pattern.

Test coverage jumped from 87 to 132 tests across 5 new test files: status.ts (17 tests for all status labels and date boundary logic), brevo.ts (9 tests for the email sending layer), notify.ts (9 tests for 6 notification functions), and the AI suggestion engine (10 tests covering adapter switching, JSON parse failures, case-insensitive matching, and graceful degradation).

Completed

  • #230 — Build getOrCreateUpcomingCycle helper using cadence settings
  • #231 — Call getOrCreateUpcomingCycle from dashboard and remove empty state
  • #234 — Show tonight’s dinner prominently at top of dashboard
  • #235 — Show this week’s meal list on dashboard with today highlighted
  • #236 — Add “rate tonight’s dinner” link on dashboard
  • #208 — Show tonight’s dinner prominently on dashboard alongside next week planning (parent, decomposed → 234-236)
  • #207 — Auto-create weekly cycles and remove manual “New week” step (parent, decomposed → 230-231)
  • #242 — Parallelize vote page queries with Promise.all
  • #244 — Fix N+1 query in admin households page
  • #243 — Add error feedback to pantry, shopping list, and settings forms
  • #248 — Fix hardcoded dark-theme colors in dashboard and lib files
  • #249 — Fix hardcoded dark-theme colors in weeks pages
  • #250 — Fix hardcoded dark-theme colors in recipes and family pages
  • #251 — Fix hardcoded dark-theme colors in preferences, onboarding, admin, and pantry
  • #240 — Replace hardcoded dark-theme colors with theme tokens (parent, decomposed → 248-251)
  • #255 — Add unit tests for status.ts
  • #256 — Add unit tests for email system
  • #257 — Add unit tests for AI suggestion engine
  • #241 — Add unit tests for status, email, AI (parent, decomposed → 255-257)

Carry-over

None — issue queue is empty. Next work will come from a new scout cycle or Paul’s direction.

Risks

  • Theme colors not browser-tested. 81 mechanical sed replacements were made. The build passes but no visual verification in Chrome was done. Some colors may have poor contrast or look wrong in light mode — needs a visual sweep.
  • Dashboard tonight’s dinner card untested with real data. The finalized meal plan query works in theory but hasn’t been tested with a real finalized week in the browser.

Flags and watch-outs

  • Test count is now 132 across 11 test files. The AI adapter tests are shallow (can’t mock require() in vitest ESM) — they verify module structure but not actual provider switching. The suggest.ts tests cover the important edge cases.
  • The getOrCreateUpcomingCycle helper creates cycles using the admin client (service role) — this bypasses RLS intentionally but means any caller can create cycles for any household. The function is only called from the dashboard server component after requireHousehold(), so this is safe.

Why customer tools are organized wrong

This article reveals a fundamental flaw in how customer support tools are designed—organizing by interaction type instead of by customer—and explains why this fragmentation wastes time and obscures the full picture you need to help users effectively.

Infrastructure shapes thought

The tools you build determine what kinds of thinking become possible. On infrastructure, friction, and building deliberately for thought rather than just throughput.

Server-side dashboard architecture: Why moving data fetching off the browser changes everything

How choosing server-side rendering solved security, CORS, and credential management problems I didn't know I had.

The work of being available now

A book on AI, judgment, and staying human at work.

The practice of work in progress

Practical essays on how work actually gets done.

Designed to learn, built to ignore

The most dangerous organizational failures don't throw errors. They look fine, return results, and quietly stay frozen at the moment of their creation.

The variable that was never wired in

The gap between having a solution and using a solution is one of the most persistent failure modes in organizations. You see the escaped variable. You see the risk register. You assume the work is done.

Your empty queue isn't a problem

Dropping a column from a production database is the organizational equivalent of admitting you were wrong. Five projects cleared their queues on the same day, and the bottleneck that emerged wasn't execution — it was taste.