2026-03-30
What shipped today
Big hardening session across the codebase. The bulk of the work fell into three themes: error boundaries, TypeScript strictness, and input validation.
Error boundaries and not-found pages. Added not-found pages for all dynamic [id] routes (weeks, recipes, family members) and error boundaries for form-heavy routes (recipe import/new, family new, weeks new) plus the admin section. This means any server-side crash or invalid ID now shows a helpful recovery UI instead of the generic Next.js error page. The codebase went from partial coverage to comprehensive — 28 error boundaries and 5 not-found pages across every route segment.
TypeScript test fixes. Vitest 4.x changed its Mock typing to a union type that isn’t directly callable. Fixed all 21 TypeScript errors across 11 test files by casting mock types appropriately. Also fixed Request vs NextRequest type mismatches in API route tests. The test suite is now fully type-clean.
Input validation and dead code. Added server-side validation to createFamilyMember, updateFamilyMember, and the household setup action createHousehold (name/timezone/dinner time validation). The setup action is particularly important since it uses the admin client which bypasses RLS. Removed the unused select.tsx shadcn component. Updated Next.js to 16.2.1 and patched dependencies.
Scout ran twice this session, creating 4 new issues for the next cycle — two of which (#363, #364) were executed in the same session.
Completed
- #349 Scope recipe_bookmarks query to finalized cycle IDs on weeks page
- #350 Add error boundary to recipe edit page
- #351 Limit weeks list to 20 most recent cycles
- #352 Shopping page: missing household ownership check
- #353 Update Next.js to 16.2.1 and patch dependencies
- #354 Add not-found page for weeks/[id] routes
- #355 Add not-found pages for recipes/[id] and family/[id] routes
- #356 Add error boundary for admin route segments
- #357 Add error boundaries for recipe and family form pages
- #358 Server action test coverage (closed as already resolved)
- #359 Remove unused select.tsx UI component
- #360 Fix TypeScript errors in test files
- #363 Add input validation to household setup action
- #364 Add input validation to createFamilyMember and updateFamilyMember
Release progress
All milestones complete (Phase 1-4, March 2026). No open milestone issues.
Carry-over
2 issues remain ready-for-dev:
- #361 Update dependencies (React 19.2.4, @supabase/ssr 0.10, ai SDK 6.0.141)
- #362 Add loading states to admin pages
Risks
None new. Codebase is stable — 327 tests passing, 0 TypeScript errors, 0 npm audit vulnerabilities.
Flags and watch-outs
@supabase/ssr0.9 → 0.10 is a minor bump but could have behavioral changes in cookie handling. Worth testing auth flows after updating.- The
select("*")pattern on weekly_cycles queries fetches all columns. Not a problem now but worth narrowing if the table grows.
Next session
- Execute #361 (dependency update) — straightforward
npm-check-updates+ test - Execute #362 (admin loading states) — single file, follows existing patterns
- Run scout after queue clears to find the next batch of work
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.
Your design philosophy is already written
Builders who work across multiple projects leave fingerprints everywhere. The same mind solves the same problem differently in every domain — and usually doesn't notice. You need someone to read it back to you.
The day nothing satisfying happened
The most productive day in an organization's life usually looks like nothing happened. No launches, no features, no announcements. Just people quietly making the existing work more honest.
Your AI agent is probably not an agent
The word 'agent' has become meaningless. Everyone from chatbot vendors to autonomous system builders uses it. We've been here before — with self-driving cars — and it didn't end well.