2026-03-22 — Serve experience end-to-end + hardening
What shipped
The serve-don’t-show experience is now end-to-end functional. The session started with #152 (serve UI) — rewriting /today as a four-state machine: energy check-in → serve one chunk → work with timer → feedback → next chunk or done. This replaced the old cycle-planning model entirely. Energy tracking (#159) was prepped and shipped next, wiring the energy budget from check-in through to the serve endpoint’s stop condition. The feedback loop followed: #164 added a text input between Done/Not now and the API call, and #165 re-ingests not-done feedback through the AI parse pipeline server-side to create new actionable chunks.
Two scout runs identified and prioritized 10 issues across dead code, security, error handling, performance, and UX. All 10 were executed in the same session. The old cycle-planning code (616 lines across 6 files) was removed (#177). Rate limiting was applied to all 5 AI-powered API endpoints (#178). The serve UI got proper error feedback instead of silent failures (#179). Prerequisite chain enforcement was added to the serve endpoint (#180). A gold “+” button was added to the nav for quick task ingestion (#181).
The second scout round focused on performance and polish. Missing database indexes were added for the serve hot path (#187). getTodaysCompletedCount was fixed to filter at the database level instead of loading all tasks into memory (#188). Stripe routes got error handling (#189). The show_timer config was wired to the working view (#190). The day-complete screen was enriched with energy context and stop reason (#191).
Completed
- #152 — Build serve UI: single chunk display with start/done/not-now
- #159 — Track energy spent and stop serving when budget exhausted
- #164 — Add feedback text input to active session done/not-done flow
- #165 — Re-ingest not-done feedback through parse pipeline
- #177 — Remove dead cycle-planning code (6 files)
- #178 — Add rate limiting to AI-powered API endpoints
- #179 — Add error feedback for failed API calls in serve UI
- #180 — Enforce prerequisite chain in serve endpoint
- #181 — Add “add tasks” shortcut to app navigation
- #187 — Add missing database indexes for serve hot path
- #188 — Fix getTodaysCompletedCount to filter at database level
- #189 — Add error handling to Stripe checkout and billing portal routes
- #190 — Wire show_timer config to working view
- #191 — Enrich day-complete screen with energy and mode context
Release progress
March 2026: 0 open / 0 closed (milestone exists but no issues assigned)
Carry-over
- #86 — Replace in-memory rate limiter with persistent solution (backlog)
- #101 — Branded emails (blocked)
- #108 — BCC founder on transactional emails (backlog)
- Source system integration (Asana/Jira/Notion outbound sync) — PRODUCT.md’s biggest unfulfilled promise, needs product design decisions
- Dashboard conflicts with serve-don’t-show model — shows task counts and queue links, needs design rethink
- Silent Supabase failures in completeTask cascade — 4 sequential unguarded DB operations, needs broader error-handling strategy
Risks
- The serve hot path now makes more queries (prereq check added, energy check parallelized) — indexes help but should monitor latency in production
- Defer re-ingestion calls the AI parse pipeline synchronously — slow for users when providing detailed feedback
Flags and watch-outs
- 14 PRs merged to main in one session — deploy to production and smoke-test the full serve flow
- The old sequencing API route and all cycle-planning components are deleted — any external references to
/api/sequencingwill 404 daily-plan.tswas significantly trimmed — onlygetTodaysCompletedCountandgetRemainingEnergyremain
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.
When your agents start breaking each other's code
Two agents modified the same file independently and created database locks. The fleet hit 135 issues in one day — and the coordination problem that comes with it.
The removal tax
The most productive thing you can do with a product is take features away. Eighty-nine issues closed across eight projects, and the hardest lesson came from a pipeline that ran perfectly and produced nothing.
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.