Work log: March 9, 2026
What shipped today
Big batch execution day — eight issues shipped through the full auto pipeline (read spec, implement, commit, push, PR, merge, close) plus three triage sweeps that cleared 28+ Sentry noise issues.
The outbound system got its two remaining pieces. An admin UI at /admin/outbound lets Paul select a prospect workspace, pick an email number (1–4), and queue generation as a preview or Fastmail draft. The engine handler delegates to the existing generate_email / generate_and_draft services. Separately, email 1 now includes voice analysis scores — clarity (1–10 based on voice_and_tone richness minus hedge words), consistency (0–100% based on coherence field completeness), and a differentiation tier (generic-phrase density). These are heuristic scores with hardcoded peer benchmarks, injected into the template before Claude re-voices the draft.
The workspace provenance tracking shipped: a source column on workspaces (signup, linkedin_cold, manual, invite) with a CHECK constraint. The DB trigger, admin workspace creation, and API prospects endpoint all set the appropriate value. The admin workspaces table now displays a source badge column.
On the feeds and scanning side, the page.scrape handler got wired into the scheduler (hourly), daily pipeline (concurrent with RSS and Google in the INTAKE step), and the scans UI. The “scan now” button now queues both rss.scan and page.scrape. Scanner type labels got human-readable names throughout the scans pages. The feed detail page shows source type (RSS vs scraped page). Discovery candidate badges and button labels were fixed to correctly distinguish RSS feeds, podcasts, and monitored websites. The Import OPML and Add Source buttons moved from the shared feeds layout into the Websites tab where they belong.
A targeted fix capped intro content fields at 75 words, preventing the AI from writing multi-paragraph introductions when a 2–3 sentence hook is all that’s needed.
Completed
- #790 — Move Import OPML/Add source buttons into Websites tab
- #807 — Wire page.scrape into scheduler, daily pipeline, and scans UI
- #802 — Add source type indicator to feed detail page
- #799 — Fix discovery candidate badge and button labels
- #797 — Add 75-word length cap for intro content fields
- #796 — Admin UI to trigger outbound emails for prospect workspaces
- #795 — Add voice analysis scores to email 1 (clarity, consistency, differentiation)
- #792 — Add source column to workspaces table
Release progress
- v1-outbound: 13 closed / 6 open (due Apr 14). Core generation and admin UI shipped. Remaining: 1 blocked (#814 stage transitions, blocked by #781 sending tool), 5 backlog (sending tool eval, email monitoring, ZeroBounce, LinkedIn Sales Nav, manual pilot).
- v2: 20 closed / 0 open (due Apr 1). Complete.
- v1.5: 3 closed / 2 open (no due date). Dashboard redesign and email system eval in backlog.
Carry-over
- #867 (social queue stacking bug) is
ready-for-prep— needs spec for slot-spreading fix - #877 (TypeError in starlette routing, 8 events) and #879 (KeyError: font-family in MCP server) are
ready-for-prep— real Sentry bugs that need investigation - #810, #809, #791 are
ready-for-dev— grindable queue for next session
Risks
- The recurring Sentry timeout/disconnect noise suggests the engine’s DB connection pool may be under pressure. Not a bug per se, but worth monitoring if it escalates.
- The MCP server font-family KeyError (#879) could affect remote MCP clients — investigate before it blocks usage.
Flags and watch-outs
- Migration
20260309000003applied to prod — addssourcecolumn with NOT NULL DEFAULT ‘signup’. All existing workspaces now show as ‘signup’ source. - The outbound admin UI queues commands but doesn’t show results inline yet — user must check commands table or Railway logs for generated email output.
Next session
- Prep and fix the two real Sentry bugs (#877 TypeError, #879 KeyError font-family)
- Prep #867 (social queue slot stacking) and execute
- Grind the
ready-for-devqueue: #810 (content preset filter), #809 (workspace archival), #791 (track website on scan) - Consider unblocking v1-outbound by evaluating the sending tool (#781) — this blocks #814 and the manual pilot
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 machine is eating faster than you can feed it
Sixty-three issues closed across thirteen projects in one day. Four milestones completed. And the hardest problem wasn't building — it was keeping up with what you've already built.
The proxy problem
Every organization has this problem: knowledge locked inside one person's head. Today I accidentally designed a solution — and it has nothing to do with documentation.
True 1-to-1 outreach is finally possible with AI
The 1-to-1 personalization promise is thirty years old. It never worked because understanding each person was too expensive. AI changed the economics.