Work log: Authexis — March 24, 2026
What shipped
The day started by finishing the product simplification work from March 23 — fixing the briefing generator to use the new status column, cleaning up content type labels from the dashboard, and resolving a 500 error on workspace switching caused by revalidatePath trying to re-render a page with stale workspace context. The fix redirects to /dashboard instead of reloading.
The admin workspaces page got a complete overhaul. The old pipeline status columns (source, stage, stage status) were replaced with a simple active/inactive badge, and a deactivate/activate toggle button was added. The is_active flag was then enforced across the entire engine pipeline — the scheduler now skips inactive workspaces for scans, briefings, and all automated jobs. Three new test suites shipped for the content handlers (content_generate_draft, content_redo_field, daily_scan_and_generate), and orphaned API routes for the removed articles/bookmarks features were cleaned up.
The biggest effort was the complete elimination of the stage_status column. This was a 7-issue arc: first removing writes from web actions (#1645), then adding command failure recovery (#1643 — when an engine command permanently fails, the content status now reverts from “generating” to the appropriate state instead of spinning forever). The column migration was decomposed into 4 child issues (#1650-#1653) covering engine content services, assistant tools/scheduler, web reads, and the final column drop. All four shipped, and the stage_status column was dropped from the database. The content pipeline now runs entirely on the status column with four clean states: generating → interview → review → final.
Completed
- #1623 — Delete orphaned v1/v2 API routes for articles, feeds, bookmarks
- #1624 — Add tests for content_generate_draft, content_redo_field, and daily_scan_and_generate (parent)
- #1626 — Add tests for content_generate_draft handler
- #1627 — Add tests for content_redo_field handler
- #1628 — Add tests for daily_scan_and_generate handler
- #1632 — Show 3 lines of summary on /contents
- #1633 — Remove “Rejected” filter on /contents
- #1634 — Replace Redo with Reject button
- #1635 — Show content title as clickable link on publish log
- #1636 — Fix briefing: use status column, add section headers, remove content type labels
- #1641 — Respect workspace is_active flag across engine pipeline
- #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 and services (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
Release progress
- v1.5: 49/50 closed (1 open)
- v2.0 — Product simplification: 25/25 closed
- v2.1 — Content model refactor: 15/15 closed
- v2.2 — Simplified pipeline: 3/3 closed
Carry-over
- Pre-existing broken engine tests:
test_briefing_generate.py,test_content_parse_transcript.py, severaltest_content_refine.pyandtest_content_create.pytests fail due to stale mocks/imports unrelated to the stage_status work - v1.5 has 1 remaining open issue
Risks
- The
stage_statuscolumn was dropped from production. If any deployed code still references it (e.g., a Railway deploy that hasn’t picked up the latest engine changes), queries will fail. Railway auto-deploys from main, so this should resolve on next deploy.
Flags and watch-outs
- The contents page “rejected” filter was migrated to filter by
status = 'final'as a “completed” toggle. This changes the semantics — worth watching if users notice different behavior. - The command failure recovery (#1643) reverts content to
intervieworreviewstatus when a command permanently fails. This is new behavior — previously the content would stay in “generating” forever. Monitor for any unexpected status transitions.
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.