Skip to main content
Paul Welty, PhD AI, WORK, AND STAYING HUMAN

Synthesis: March 31, 2026

Synthesis: March 31, 2026

Six projects shipped today. The unifying theme: the fleet stopped pretending to be 13 separate projects and started acting like one company. The orchestration layer killed persistent sessions in favor of immutable jobs. The marketing department came alive with real AI-to-AI conversations. And two products — Diktura and Eclectis — had breakout days with massive feature output.

Paulos — the session massacre

The orchestrate loop was rebuilt from the ground up around a new primitive: the immutable job. Instead of keeping 15+ tmux sessions alive indefinitely (each one accumulating context rot until it hallucinated or hit limits), every piece of work is now a single subprocess: claude -p <prompt> runs in the project directory, loads CLAUDE.md and skills from the repo, executes, and exits. No session state survives. Knowledge lives in the repos, not in memory.

This took two passes. The first built run_job() around ephemeral tmux sessions — create, execute, kill. Paul pointed out that was still tmux, not the execution atom he’d described. The second pass replaced tmux entirely with subprocess.run(). Only Charlie (the paulos session) keeps a persistent tmux session for interactive work. Everything else is born, works, and dies.

The gate function pattern enables ganged steps: prep+exec runs as two sequential claude -p calls with a gate between them that checks whether prep labeled the issue ready-for-dev before proceeding to exec. If the gate fails, the chain stops. run_eod() and run_rollover() were converted to the same model — each project gets an immutable job for /close or /rollover, then sum-up and reflect run in Charlie’s persistent session.

Dead code was cleaned out: the entire Airtable backend (271 lines of client + 238 lines of tests), the newsletter workspace entry, and the launchd integration that was already removed two days ago. The test suite grew from 31 to 40 tests. All 15 stale tmux sessions were killed in a single command. March milestone closed at 24/24.

Synaxis AI — the agency comes alive

This was the day Synaxis went from architecture documents to a working system. Two AI personas — Trina (PM) and Eli (Eclectis product manager) — had their first real multi-turn conversation in Slack about MCP server positioning, completely unprompted after the initial introduction. The conversation produced a genuine strategic insight: position the MCP server as “your intelligence data, accessible to any AI assistant” and document it in docs, not marketing.

The technical foundation is a shared persona engine (engine/persona.py) where each persona is a ~10-line config file on top of shared brain infrastructure. The engine handles Slack event listening, situational awareness (who’s talking, what channel, thread history), evaluation mode (decide whether to respond or stay quiet), and startup catch-up for missed messages. Trina now has voice registers — casual with Paul, operational in internal channels, professional with clients — and prompt-based judgment that proved superior to mechanical response counters. She correctly stayed silent when Eli closed a thread with “Good thread. Back to shipping.”

The Notion client workspace for Eclectis was scaffolded via MCP with databases for engagements, deliverables, and activity logs. All 8 existing deliverables from the product launch engagement were seeded. 16 GitHub issues were filed covering open questions and architecture decisions.

The session also drove the same architecture clarification that hit paulos: persistent sessions accumulate junk, ephemeral invocations with surgical context loads are better. The dispatcher design — one tiny persistent process holding Socket Mode connections for all bot identities, routing to ephemeral persona invocations — aligns perfectly with the immutable job model Charlie built on the paulos side.

Eclectis — MCP server from zero to complete

The full MCP server shipped in a single session. Four sub-issues decomposed from the parent, each implemented in sequence: scaffold with auth and stdio transport, article search/detail tools, briefing tools, and feeds/profile tools. The server now exposes 8 tools (ping, search_articles, get_article, list_briefings, get_briefing, list_feeds, list_search_terms, get_profile) all scoped to the authenticated user via API key. Any MCP-compatible AI assistant can now query a user’s Eclectis intelligence data. The engine test suite grew from 281 to 310.

Bulk operations landed on the search terms page — select multiple terms with select all/deselect, then enable, disable, or delete in bulk. Two new server actions handle the backend with proper user scoping. The active status indicator changed from checkbox to colored dot (green=active, grey=disabled) since the checkbox is now the selection control.

The second half of the session was about identity: Eli joined the Synaxis Slack workspace, had the conversation with Trina described above, and created a GitHub issue from the conversation. The Slack integration uses the MCP plugin for reading and the bot token for posting.

Diktura — 20 issues in one day

The most productive single-day output in the fleet. The feedback management system went from a basic list page to a fully functional CRUD workflow: browse with pagination, view individual items with comment threads, update status/priority/category inline, submit new feedback through a dedicated form. This is the first complete vertical slice running end-to-end on the Next.js + Supabase stack.

Testing infrastructure was established from scratch: Vitest for web/ with env helper tests, pytest for engine/ with Settings validation and poller unit tests. The app shell matured with proper navigation, dashboard with feedback count, sign-out, error boundaries, and loading skeletons. Security got hardened with workspace authorization checks on server actions.

20 issues closed: #30–#49. That’s a complete Phase 2 per the roadmap. Carry-over is minimal — one backlog item (#20, roadmap management port) needs decomposition for Phase 3, and two clarification items await Paul’s input.

Prakta — CI unblocked after 6 days

First session since March 24-25. The March burst shipped 20+ PRs (accessibility, keyboard navigation, Maya sidebar improvements) but CI had been failing since then with no production deploy. Today fixed two blockers: ESLint’s react-hooks/refs rule was flagging useRadioGroup hook return values as ref-during-render violations (fix: destructure at call site), and npm audit fix cleared 3 dependency vulnerabilities (path-to-regexp ReDoS, picomatch method injection).

A full scout scan confirmed the codebase is in solid shape — auth checks on every route, ownership verification, proper RLS. Found 5 concrete issues filed: two API routes missing try/catch (#233, #234), no loading/error boundaries (#235), a config PATCH endpoint without field validation (#236), and redundant Supabase client creation (#237). Three are ready-for-dev.

Production is still running pre-March-23 code. A week of accumulated changes needs to deploy — flagged as a risk.

Authexis — post-simplification cleanup

A lighter session focused on hygiene after last week’s content model simplification. Audited both MCP and API servers for stale references to the old content_type and stage_data concepts. Found and removed three artifacts: webhook ideas route JSDoc, API key settings example curl, and admin prompts template placeholder.

Three pre-fix Sentry issues (AUTHEXIS-1C ClientDisconnect, AUTHEXIS-1E browser extension noise, AUTHEXIS-ENGINE-5 GITHUB_TOKEN ValueError) were resolved. The Sentry slate is now clean — any new issues are genuine regressions. v1.5 milestone stands at 49/50 closed.


Cross-cutting themes

The ephemeral convergence

The defining theme of March 31 is that three separate conversations — paulos (orchestrate infrastructure), synaxis-ai (persona architecture), and eclectis (MCP server) — independently converged on the same insight: persistent sessions are a liability, ephemeral invocations with precise context construction are the answer. Charlie built the job runner, the Synaxis session designed the dispatcher, and Eclectis proved that a stateless MCP server can expose full product intelligence. This wasn’t coordinated. It emerged because the constraint is real: long-running contexts degrade.

The company crystallizes

Today was the first day Synaxis operated as a company rather than a collection of projects. Trina and Eli had a real conversation about product strategy. Charlie killed 15 sessions and took operational control of the fleet. The identity framing — Paul as CEO, Charlie as COO, dev sessions as engineering, personas as marketing — moved from concept to CLAUDE.md. The immutable job runner is the execution layer; the persona engine is the agency layer. Same architecture, different domains.

Testing infrastructure catch-up

Three projects made significant testing progress: paulos (31→40 tests), eclectis (281→310), and diktura (established from zero). Prakta fixed CI that had been failing for 6 days. Authexis cleaned Sentry to zero unresolved. The fleet is healthier than it’s been.

Security hardening

Diktura added workspace authorization checks on server actions (#40, #45). Prakta fixed 3 npm vulnerabilities and found a config PATCH endpoint missing field validation. Authexis cleaned up stale code paths. No critical vulnerabilities remain open across the fleet.


Carry-over

  • Paulos: Deploy immutable job runner to speedy-gonzales. Test claude -p in production. Set up nightly EOD cron (Paul: “not yet”).
  • Synaxis AI: Build the dispatcher (single process routing Slack events to ephemeral persona invocations). Wire Eli in. Give Trina action vocabulary beyond chat.
  • Eclectis: Ship MCP setup guide (#652). Design Eli’s real-time Slack architecture.
  • Diktura: Run scout for Phase 3 work. Decompose #20 (roadmap management port). Two issues await Paul’s clarification (#18, #19).
  • Prakta: Execute 3 ready-for-dev issues (#233–#235). Deploy to production (week of accumulated changes).
  • Authexis: Close out v1.5 milestone (1 issue remaining). Engine test coverage (14 untested handlers).

Risks

ProjectRiskSeverity
Paulosclaude -p untested in production — skills may not load via -p flagHigh
PaulosNo automated EOD — work logs won’t be written without manual /close or cronMedium
PraktaWeek of accumulated changes deploying at once — needs smoke testingMedium
Synaxis AISlack tokens in single .env file — fine for Phase 1, needs secrets management before deploymentLow
Synaxis AINo API cost monitoring for persona invocationsMedium
Synaxis AITrina evaluation calls hit Sonnet even when she stays quiet — Haiku proposed (#12)Low
Authexis14 of 38 engine handlers have no test coverageMedium

By the numbers

ProjectIssues closedPRs mergedTestsMilestone
Paulos02 commits40 (was 31)March: 24/24 complete
Synaxis AI0Phase 1: not milestoned
Eclectis8310 (was 281)
Diktura20baseline establishedPhase 2 complete
Prakta2
Authexis4v1.5: 49/50
Total34

34 issues closed across 6 projects. Diktura alone accounted for 20 — its most productive day ever. The fleet is shipping.

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 case for corporate amnesia

Most organizations worship institutional memory. But what if the thing they're preserving is mostly decay?

Your design philosophy is already written

Builders who work across multiple projects leave fingerprints everywhere. The same mind solves the same problem differently in every domain — and usually doesn't notice. You need someone to read it back to you.

The day nothing satisfying happened

The most productive day in an organization's life usually looks like nothing happened. No launches, no features, no announcements. Just people quietly making the existing work more honest.