2026-03-24 — Feature gaps, dead code cleanup, and accessibility sweep
What shipped
Two scout-triage-execute cycles ran back to back. The first cleared 5 issues from the previous day’s scout (#207-#211), and the second scouted fresh, triaged, and executed 4 more issues (#217-#221) plus decomposed and completed all 3 children of a larger accessibility issue (#226-#228). 12 issues closed in total across 10 PRs.
The biggest feature gap closed was done-path check-in feedback re-ingestion (#217). PRODUCT.md promises that both done and not-done check-in notes get parsed into new tasks — the defer path had this via after(), but the complete path only stored notes without parsing. Now both paths mirror the same background re-ingestion pattern. Dead code cleanup removed 202 lines: two passkey register routes that were never wired to the frontend, a billing portal route with no callers, and two unused type exports from serve.ts (#218).
Error handling was strengthened across the serve endpoint’s 4 unguarded DB operations (#219) — energy budget upsert, grain chain query, prerequisite query, and source task lookup all now check errors and log with context. Two remaining client-side fetch calls missing res.ok checks were fixed in the paywall checkout and EOD learning flows (#221).
The accessibility work was the deepest investment. The parent issue (#220) was decomposed into 3 children and all were executed: Escape key dismiss + auto-focus for the Maya sidebar and feedback textarea (#226); ARIA attributes (aria-label, aria-pressed, aria-live) across 6 components (#227); and a full radio group pattern conversion with arrow key navigation for the energy state, cognitive mode, scale, and choice button groups (#228). A reusable useRadioGroup hook was created for the arrow key logic. Focus management between energy check-in steps was added via useRef + useEffect.
Completed
- #207 — completeSourceTask user_id verification
- #208 — WebAuthn challenges RLS policy fix
- #209 — Defer re-ingestion moved to background
- #210 — completeTask cascade error handling
- #211 — Post-login redirects to /today
- #217 — Re-ingest done-path check-in feedback through parse pipeline
- #218 — Remove dead code (202 lines)
- #219 — Serve endpoint error handling (4 DB operations)
- #220 — Accessibility parent (decomposed into #226, #227, #228)
- #221 — res.ok checks on paywall checkout and EOD learn
- #226 — Keyboard dismiss + auto-focus (Maya sidebar, feedback textarea)
- #227 — ARIA attributes across 6 components
- #228 — Radio group pattern + arrow key navigation
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
- Maya lacks full cognitive profile — only gets today’s tasks, not historical patterns or learning insights
- Active queue is empty — next work requires either new scout findings or feature-level product decisions
Risks
- 10 PRs merged in a single day — production deploy and smoke test needed (auth flows, serve flow, wrap-up, settings)
- The
after()API is used in both defer and complete routes now — behavior in local dev may differ from Vercel production
Flags and watch-outs
- Active issue queue is clear. Only 3 backlog/blocked issues remain (#86, #101, #108). Future work is either new feature development or deeper product gaps (source system reporting, Maya context enrichment).
- The accessibility work is surface-level ARIA + keyboard nav. No automated accessibility testing (axe, lighthouse) exists — manual screen reader testing would validate the changes.
- DECISIONS.md was updated with the dashboard-vs-today entry point decision on 2026-03-23.
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.