Work log: Authexis — March 25, 2026
What shipped
The dominant theme was aligning all surfaces with the simplified product model. The March 21-24 refactor changed the web app and database, but the API, MCP tools, and Apple app were still referencing old concepts (stage_status, content types, feeds, articles, bookmarks). Today completed that alignment across every surface.
The stage_status column migration finished with 7 issues shipped (#1643-#1653): command failure recovery was added (content reverts from “generating” when a command permanently fails), then the column was removed from web actions, engine services, engine handlers, web reads, and finally dropped from the database. The entire content pipeline now runs on a single status column with four states: generating → interview → review → final.
The API alignment (#1674 decomposed into #1679, #1680, #1681) replaced stage_data with flat columns in API responses, made content_type_slug optional (defaults to essay), removed article enrichment from the promote endpoint, and cleaned up dead stage name mappings. The MCP tools (#1675) were cleaned up — two dead tools deleted (get_feed_stats, run_google_scan), four more simplified to remove content_type filters and stale navigation routes.
The Apple app alignment (#1676 decomposed into #1685-#1688) was the largest surface. Broken widget PostgREST queries were fixed (they were querying the dropped stage_status column), data models and StatusBadge were updated for the 4-status pipeline, 15 Swift files for articles/feeds/bookmarks were deleted (-4,508 lines), and the content type filter was removed from ContentListView. The dashboard was also cleaned up to remove feed/bookmark/article stat cards.
A comprehensive scout ran twice, finding and fixing: security gaps (missing workspace_id on DELETE endpoints), dead code (account deletion referencing removed tables, orphaned feed validation endpoint, dead plan gates functions), performance issues (N+1 query in social queue requeue, missing composite indexes), and the featured image display (was generated but never shown). The humanizer was updated with new stop phrases from the paulos VOICE.md.
The test suite went from 280 tests with 25 failures to 326 tests with 0 failures. Broken tests were fixed (#1667-#1669), and new tests were added for the briefing_generate handler (#1706), content service (#1707), and generation service (#1708).
Completed
- #1643 — Add command timeout and user-visible error when engine doesn’t respond
- #1644 — Remove unused feeds/searchTerms queries from layout.tsx
- #1645 — Stop writing stage_status from web actions
- #1648 — Stop writing stage_status in engine handlers (parent, decomposed)
- #1650 — Stop writing stage_status in engine content service and handlers
- #1651 — Stop writing stage_status in assistant_tools, outbound_email, scheduler
- #1652 — Migrate web stage_status reads to status column
- #1653 — Drop stage_status column from contents table
- #1658 — Deploy failure (closed as transient)
- #1659 — Sentry traceback (closed as related to #1658)
- #1660 — Fix broken engine tests (parent, decomposed)
- #1661 — Publishing error feedback (closed as already done)
- #1662 — Remove dead code from removed features
- #1663 — Show featured image on content detail page
- #1664 — Briefing email delivery (closed as already done)
- #1667 — Delete dead test files
- #1668 — Fix test fixtures: stage_data → flat columns
- #1669 — Fix test mocks: humanize + integration_id
- #1673 — Update humanizer stop phrases
- #1674 — Align API v1/v2 (parent, decomposed)
- #1675 — Align MCP tools with simplified product model
- #1676 — Align Apple app (parent, decomposed)
- #1679 — API v2 contents: flat columns in responses
- #1680 — API promote/webhooks: stop writing stage_data
- #1681 — API field update: remove dead stage mappings
- #1685 — Apple widget: fix broken PostgREST queries
- #1686 — Apple models: update for 4-status pipeline
- #1687 — Apple: remove articles/feeds/bookmarks (-4,508 lines)
- #1688 — Apple: remove content type filter
- #1693 — Add workspace_id filter to DELETE endpoints
- #1694 — Remove deleted table references from account deletion + analytics
- #1695 — Fix N+1 query in social queue requeue
- #1696 — Remove orphaned feed endpoint + dead plan gates
- #1697 — Add composite indexes for social_posts and ideas
- #1703 — Remove stale bookmarks from middleware + Apple dashboard
- #1704 — Add tests for untested handlers/services (parent, decomposed)
- #1706 — Add tests for briefing_generate handler
- #1707 — Add tests for content service core functions
- #1708 — Add tests for generation service pure functions
Release progress
- v1.5: 49/50 closed (1 open — dashboard redesign, backlog)
- v2.0 — Product simplification: 25/25 closed
- v2.1 — Content model refactor: 15/15 closed
- v2.2 — Simplified pipeline: 3/3 closed
Carry-over
- No active issues remain — queue is empty
- Apple app needs Xcode build verification (changes were code-only, not compiled)
- 13 untested handlers remain (lower-priority follow-ups from #1704)
Risks
- Apple app changes are extensive (models, navigation, dashboard, widgets) but haven’t been compiled in Xcode — potential build issues when Paul opens the project
- Railway engine deploy may need a manual trigger if auto-deploy didn’t pick up the latest commits
Flags and watch-outs
- The
stage_datacolumn still exists on the contents table but is no longer the source of truth. Theupdate_stage_fieldRPC still writes to it for backward compat. Consider dropping it in a future cleanup pass. - The Apple app’s
ContentAPIService.fetchContents()function likely needs parameter updates (was passingstageStatus:andcontentTypeSlug:which no longer exist) — this wasn’t caught in the current pass since we can’t compile Swift without Xcode.
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.