2026-03-05 — Eclectis
What shipped today
The big theme today was closing the feedback loop — making the engine’s AI scoring actually learn from user behavior and apply those learnings everywhere, not just in one handler.
Newsletter issues tracking landed first. The engine now creates a newsletter_issues row for each incoming email edition, tracks its processing status, and links articles back to their parent issue. The web detail page at /newsletters/[id] groups articles by issue with status badges, giving visibility into what each email contained and whether processing succeeded or failed. This required a new migration, engine handler updates, and a rewrite of the detail page.
Vercel deploys were broken due to a Turbopack panic when combined with Sentry’s withSentryConfig wrapper. After investigating several approaches (env vars, removing Sentry config), the fix was straightforward: Next.js 16 supports next build --webpack to force webpack for production builds while keeping Turbopack for dev. Sentry source maps now upload correctly again.
PostHog dual-write ensures engagement events (clicks, votes, bookmarks) flow to both Supabase (for the engine’s feedback loop) and PostHog (for product analytics). This was a quick win using posthog-node server-side.
The biggest change was wiring learned preferences into all scoring prompts. Previously, learned_preferences from user.learn was only consumed by article.score. Now it’s injected into every prompt that evaluates content: RSS scanning, Google search scoring, briefing generation, and the article pre-score gate. A new shared module (engine/user_context.py) eliminated duplicated preference-fetching code across four handlers. The user.learn handler was also enhanced to auto-generate search terms from engagement patterns, replacing the manual-only flow.
Completed
- #65 — Newsletter issues — track individual email editions and ingestion status
- #66 — Migration: create newsletter_issues table
- #67 — Engine: newsletter.process creates newsletter_issues rows
- #68 — Web: show newsletter issues on detail page
- #69 — Sentry source map uploads (resolved by
--webpackflag) - #70 — Dual-write engagement events to PostHog
- #71 — Wire learned preferences into all prompts + auto-generate search terms
- #62 — Closed as superseded by #71
Release progress
No open milestones. All four milestones (M1–M4) are closed. The remaining 4 open issues are unmilestoned backlog.
Carry-over
- #63 (International search) is prepped and labeled
ready-for-grind— spec written, ready to execute next session
Risks
- Turbopack + Sentry is a known upstream issue. The
--webpackworkaround is solid but worth checking when upgrading Next.js. user.learnauto-generated search terms replace previous learned terms on each run. If the model produces poor queries, users could see irrelevant results until the next learning cycle.
Flags and watch-outs
- PostHog and Sentry are wired but no custom PostHog events beyond engagement tracking have been added yet. Worth instrumenting key flows (onboarding completion, scan triggers, briefing opens) when prioritized.
- The
search_countriespreference (#63) will multiply Serper API calls by the number of countries configured. Monitor API usage after shipping.
Next session
/grind 63— International search is ready-for-grind, should be a quick autonomous execution- Consider creating a milestone for the next batch of work (integrations? inbox scanning?) to move issues out of the unmilestoned backlog
- Review remaining backlog (#64 inbox scanning, #47 integrations, #31 passkeys) and decide what’s worth milestoning vs parking
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 first real user breaks everything
Your product works until someone actually uses it. The gap between 'works in dev' and 'works for a person' is where most systems fail — and most organizations avoid looking.
The loop nobody bothers to close
Most systems observe. Almost none learn. The difference is a feedback loop — and the boring cleanup work that makes it possible.
Your process was built for a different speed
When work changes velocity, governance systems don't just fall behind. They become theater. And theater is worse than nothing—it gives you the feeling of control without any of the substance.