Work log — 2026-04-06
What shipped today
The session started with a prod deploy and a full scout run — five parallel agents scanned error handling, security, dead code, test coverage, feature gaps, UX gaps, dependency health, performance, and Sentry. The scout filed 5 issues, and three were shipped in the same session: podcast feed O(n²) fix (#678), dead code removal (#679), and scan polling timeout UX (#681).
The big theme was fixing the new-user experience. Email confirmation was broken — Supabase’s {{ .ConfirmationURL }} routes through their server which consumes the OTP token on GET, so email link prefetchers killed tokens before users clicked. Converted /auth/confirm from a server route handler to a client-side page wrapped in Suspense — prefetchers get HTML but don’t execute verifyOtp. Updated all 5 email templates to use {{ .TokenHash }} with direct links, bypassing Supabase’s server entirely. Paul pasted the updated templates into the Supabase dashboard. The fix was shared in the new #breakroom channel and authexis ported it the same afternoon.
Trial users were blocked from all AI features — the BYOK gate only checked plan == "pro" but new signups get plan = "free" with trial_started_at set. Added 14-day trial window logic to both engine (byok.py) and web (plans.ts). Also cleaned up onboarding: removed the dead LinkedIn field and file upload, improved the interests textarea placeholder to show paragraph format, rewrote the completion banner (“creating your first briefing now” with a settings link), and wired up AI-generated search terms — step 1 interests trigger user.learn in the background, step 3 polls for the generated terms. Paul verified the full signup flow end-to-end on production.
Also contributed four rounds of strategy input for the Synaxis.AI unified vision, covering architecture, data model, AI layer, and practical timeline from Eclectis’s perspective.
Completed
- #678 — Podcast feed generator O(n²) indexOf → map index
- #679 — Remove dead code: openai_client.achat() and ai.get_provider_for_task()
- #681 — Onboarding UX: scan polling timeout shows helpful message
- #682 — Auto-generate search terms from interests during onboarding
- #683 — Rewrite onboarding completion copy and add timezone setting
- (untracked) Email confirmation converted to prefetch-resistant client-side page
- (untracked) Trial BYOK gating fix — 14-day trial users use platform key
- (untracked) Onboarding cleanup — removed LinkedIn, file upload, improved interests copy
- (untracked) Sentry ECLECTIS-9 resolved twice (Safari stream error, trash)
Carry-over
- #677 (needs-clarification) — Landing page claims Pocket integration. Waiting on Paul: remove claim, build it, or “coming soon”? Comment suggested just removing it.
- #680 (needs-clarification) — Silent error swallowing in handlers. Investigation showed intentional graceful degradation. Recommended closing.
- backlog (7): #659, #484, #482, #481, #480, #471, #64
Risks
- Sentry source map uploads fail on every Vercel build (org mismatch in Sentry config). Non-blocking but no source maps in error reports.
- Engine poller is single-process — scaling concern surfaces at ~5 concurrent clients if Synaxis.AI engagement ramps up.
Flags and watch-outs
- Email templates must be manually pasted in Supabase dashboard — no API. Templates are in
docs/email-templates/and are now in sync with the code. - Breakroom webhook: use curl, not Python urllib.request (403 errors). Python only for JSON encoding.
- The breakroom (#breakroom Discord channel) is live and working — first day saved authexis from rediscovering the email confirm bug independently.
Next session
- Resolve #677 — Paul hasn’t weighed in on Pocket. The comment says “if no strong opinion, just remove it.” Do it.
- Close #680 — the error handling investigation is done. Close with existing comment.
- Verify trial BYOK — check the admin pipeline view for the test signup user. Confirm google_search.scan and user.learn succeeded.
- Deploy to prod — if any new commits land before next session.
- Run /dev-loop — queues will be empty after #677 and #680 are resolved. Run /scout if idle.
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 most important thing a leader can build is the conversation that happens when they leave the room. Today, five departments started sharing fixes, cracking jokes, and solving each other's problems — without being asked.
I ran my AI agency's first real engagement. Here's everything that happened.
Five AI personas. One client onboarding. Fifteen minutes of things going wrong in instructive ways.
The costume just got cheap
If 80 percent of what you thought was judgment turns out to be pattern recognition, what does that say about you? Not about your job — about you.