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

2026-03-20 — Dinly: quality pass, feature gaps, and the weekly cadence system

What shipped today

The session opened with two broad /scout passes that identified 13 issues across code quality, UX gaps, and missing features. All were executed in a single session.

The first scout pass focused on code quality and UX. The ranking engine got its first unit tests — 17 cases covering all 7 scoring dimensions (votes, dietary disqualification, preferences, history, requests, bookmarks, bucket assignment). Two performance fixes landed: the curate action’s N+1 candidate updates were batched into 2 queries, and the results page’s 3 redundant family_members subqueries were eliminated. The planning flow got comprehensive UX improvements — empty states on every step (candidates, vote, curate, resolve, results), form validation feedback (min-selection, vote hints, finalize confirmation for partial weeks), and loading/disabled states on the voting status action buttons. Recipe import failures now surface to the user instead of being silently swallowed.

The second scout pass identified feature gaps by comparing the implementation against the product vision. The highest-impact finding was that email notifications were fully built (templates, Brevo integration, notify functions) but never wired into the app actions. Opening voting and finalizing plans now send branded emails to all family members. Other feature additions: onboarding completion warning before opening voting, print/copy export for shopping lists, nutrition information display on recipe detail pages, and ingredient search in the recipe library (searches 3,800+ recipes by ingredient name alongside title and description).

The biggest new feature was the weekly cadence system — a complete planning timeline derived from 4 household settings: week start day, meals per week, finalize lead time, and voting window. A pure computation function derives all milestone dates (draft due, voting opens, reminder, voting closes, finalize). The settings page got a new “Planning cadence” card with a live timeline preview. The cycle detail page now shows a horizontal step indicator with green checkmarks for completed steps and a pulsing dot for the current step. The plan builder respects meals_per_week instead of hardcoding 7. The “new week” page defaults to the next configured start day. A daily Vercel cron job sends context-appropriate nudge emails: draft reminders to cooks, voting reminders to unvoted members, and finalize reminders when it’s time to curate and shop.

Documentation was updated: USE-CASES.md rewritten with 23 use cases reflecting the full current state, FAQ.md created covering all user-facing questions, and CLAUDE.md updated with test commands, Supabase details, and key patterns.

Supabase was configured for production: redirect URLs set, SMTP configured via Brevo, email templates pasted, and migration 009 (cadence settings) applied via supabase db push.

Completed

  • #107 Add unit tests for ranking engine
  • #108 Batch candidate status updates in curate action
  • #109 Deduplicate family member queries on results page
  • #110 Add empty states and validation to the planning flow (decomposed)
  • #111 Surface recipe import failures to the user
  • #116 Add empty states to planning flow pages
  • #117 Add validation feedback to planning flow forms
  • #118 Add loading and disabled states to cycle status actions
  • #122 Wire email notifications into app actions
  • #123 Warn before opening voting if members haven’t completed onboarding
  • #124 Add print and text export to shopping list
  • #125 Display nutrition information on recipe detail page
  • #126 Add ingredient and cook time filters to recipe library
  • #132 Add cadence settings columns to households table
  • #133 Add planning cadence section to household settings page
  • #134 Build cadence timeline computation function
  • #135 Add cadence timeline visualization to cycle detail page
  • #136 Use meals_per_week setting in plan builder and finalize confirmation
  • #137 Add daily cron job for cadence nudge emails

Release progress

  • March 2026: 6/6 closed (complete)
  • Phase 1–4: all closed

Carry-over

  • Set CRON_SECRET env var in Vercel for the cadence cron job to authenticate
  • The full planning flow (Draft → Vote → Curate → Resolve → Days → Shopping) has still not been tested end-to-end in the browser with real data — this has been carry-over since March 19
  • Supabase email templates were pasted manually in the dashboard but not verified with a real auth flow

Risks

  • The cadence cron job uses createAdminClient (service role) to query across households. If household count grows, this query could become expensive — consider adding an index on weekly_cycles.status or batching by household.
  • The ingredient search fetches ALL recipe_ingredients for the household (could be 50,000+ rows for a large library). May need server-side filtering or a search index if performance degrades.

Flags and watch-outs

  • vercel.json was created with cron config — needs CRON_SECRET env var set in Vercel
  • New week page was split into server component + client form (page.tsx + new-week-form.tsx) to access household settings
  • 33 unit tests now exist (17 ranking + 16 cadence) — run with npm test from web/
  • FAQ.md and USE-CASES.md are new docs — keep them updated as features evolve

Next session

  • Test the full planning flow end-to-end in the browser: create week → candidates → vote → close → curate → resolve → days → finalize → shopping list
  • Set CRON_SECRET in Vercel: vercel env add CRON_SECRET production
  • Verify email notifications fire correctly (open voting, finalize plan)
  • Deploy to production and verify the cadence timeline visualization renders
  • Consider: Stripe trial plan integration (mentioned day 1, still unscoped)
  • Consider: Paprika import support (second priority after Mela)

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.

The product changed its mind

A product pivoted its entire philosophy mid-session — from 'here's your list' to 'here's your next thing.' The code shipped in the same conversation as the idea. That's not iteration. That's something else.

Your project management tool was made for a non-human (AI) factory, not for you

Every project or task management tool on the market descends from Frederick Taylor's factory floor. The assumptions were wrong then. They're catastrophic in the Age of AI.

The last mile is all the miles

Building the product is the fun part. Deploying it, configuring auth, pasting email templates into dashboards, rotating leaked API keys — that's where the work actually lives.