Work log — 2026-04-01
What shipped today
A small but important hardening fix landed today. The /api/learn and /api/weekly routes were both missing top-level try/catch blocks, meaning any unhandled promise rejection would crash the request with a bare 500 and no useful error information. Both routes now catch and log the underlying error via console.error, return a structured {error: "..."} response with status 500, and won’t silently swallow failures. This closes out the last known unguarded route-level error handling gap flagged in the recent scout sweep.
This session was light on volume but continues the steady CI/hardening work that’s been the theme of the past week — closing the scout-identified gaps methodically before turning attention to new features.
Completed
- #233 — Wrap learn and weekly routes in try/catch (error handling for unhandled rejections)
Release progress
- March 2026 milestone is still open but empty (0 issues attached). It’s a vestigial open milestone — no blocking issues. Can be closed manually if desired.
Carry-over
- #235 (ready-for-dev) — Validate config PATCH updates against allowlist
- #234 (ready-for-dev) — Add loading.tsx and error.tsx boundaries for app routes
- #237 (ready-for-prep) — Reduce redundant Supabase client creation in serve route
- #86 (backlog) — Replace in-memory rate limiter with persistent solution for production
- #101 (blocked) — Branded transactional emails (blocked on email template work)
Risks
- Rate limiter (#86) is still in-memory. Fine for dev/low-traffic, will fail silently under multi-instance Vercel deployment. Should be elevated before any meaningful traffic.
Flags and watch-outs
supabase/.gitignore,supabase/config.toml, andweb/.gitignoreremain untracked — these are local config files, not code. They’ve been sitting untracked for multiple sessions. Worth deciding whether to.gitignorethem or commit them.- The March 2026 milestone has 0 issues attached but is still open. It was never populated — safe to close.
Next session
- Pick up #235 (validate config PATCH against allowlist) — it’s ready-for-dev and a clean, self-contained security improvement
- Pick up #234 (loading.tsx + error.tsx boundaries) — also ready-for-dev, improves app resilience
- Consider closing the empty March 2026 milestone
- Decide fate of the three untracked supabase/web config files
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.
Delegation without comprehension is just prayer
The organizations that survive won't be the ones that automated the most. They'll be the ones that figured out what to stop delegating.
The case for corporate amnesia
Most organizations worship institutional memory. But what if the thing they're preserving is mostly decay?
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.